2014-11-20 44 views
1

对于我的项目,我有一个server.js,它调用一个辅助函数place-search.js,如下所示。如何从辅助函数返回值到server.js NodeJS

var express = require('express'); 
 
var server = express.Router(); 
 

 
var placeSearch = require("./helpers/place-search"); 
 
var obj = "hello"; 
 

 
server.use(function(req, res, next) { 
 
\t console.log(req.method, req.url); 
 
\t next(); 
 
}); 
 

 
server.post('/', function(req, res) { 
 
\t /* get the object passed by the client's post request */ 
 
\t obj = req.body; 
 

 
\t //console.log("Obj: " + obj); 
 

 
\t /* send the confirmation back to the client */ 
 
\t res.status(200).send("body"); 
 
\t placeSearch.placeSearch(obj); 
 
}); 
 

 
module.exports.server = server;

这里是我的地方,search.js:

var config = require("./config.js"); 
 
var Promise = require('bluebird'); 
 
var DistanceMatrix = require("./distance-matrix.js"); 
 
var GooglePlaces = Promise.promisifyAll(require("googleplaces")); 
 
var googlePlaces = new GooglePlaces(config.apiKey, config.outputFormat); 
 
var extract = require('./extract.js'); 
 
var combination = require('./combination_ver2.js'); 
 
var permutation = require('./permutation.js'); 
 

 
function placeSearch(obj) { 
 

 
    console.log("Inside place search!"); 
 

 
    /** 
 
    * Place search - https://developers.google.com/places/documentation/#PlaceSearchRequests 
 
    */ 
 
    var arr = []; 
 
    var count = 0; 
 
    var rad = obj["radius"]; 
 
    
 
    console.log("radius: " + rad); 
 
    var loc = obj["location"]; 
 
    console.log("Location: " + loc); 
 
    var mode = obj["mode"]; 
 

 
    var params = obj["params"]; 
 

 
    /* client's keywords */ 
 
    var arr; 
 
    var ar = []; 
 
    for (var i = 0; i < params; i++) { 
 
     arr[i] = obj[i]; 
 
     console.log(arr[i]); 
 
     var param = { 
 
      location: loc, 
 
      radius: rad, 
 
      mode: mode, 
 
      keyword: arr[i] 
 
     }; 
 
     ar.push(param); 
 
    } 
 

 
    console.log("before promises"); 
 

 
    var promises = ar.map(function(name) { 
 
     return googlePlaces.placeSearch(name, function(response) { 
 
      arr.push(response); 
 
      console.log(response); 
 
      console.log(count++); 
 
      //If all responses have been returned 
 
      //Find combos and pass to distance-matrix 
 
      if (count == ar.length) { 
 
       var Matrix = new Array(); 
 
       var result = new Array(); 
 

 
       //to extract only lat and lng from arr.results 
 
       //Matrix = extract.extract(arr); 
 
       result = combination.combination(arr); 
 

 
       // NOW RESULT IS THE ARRAY OF ALL COMBINATION 
 

 
       // NOW RESULT IS THE ARRAY OF COMBINATIONS OF latlng pairs AND PASS IT TO FRONTEND 
 
       /*result.forEach(function(combo, index) { 
 
        console.log("combo" + combo) 
 
        DistanceMatrix.distanceMatrix(mode, combo, result.length); 
 
       });*/ 
 

 

 
       // IF YOU WANT TO SEE PERMUTATION 
 
       //permutation.permutation(result); 
 

 
       console.log("combination results: " + result); 
 

 
      } 
 

 
     }) 
 
    }); 
 

 
} 
 

 
module.exports.placeSearch = placeSearch;

我的问题是我不知道怎么的结果变量传回server.js,以便我可以使用该结果作为另一个辅助函数的输入。我不能为我的生活弄清楚如何做到这一点。任何帮助都将不胜感激。

回答

0

嗯,我没有看到你的placeSearch函数现在完全返回任何东西,也没有做任何形式的回调。你的placeSearch函数应该公开一个回调参数,一旦你有了你想要发回的答案,它就会被调用。

您的服务器文件将对该回调采取行动。缩写代码,它会是这个样子:

server.post('/', function(req, res) { 
    /* get the object passed by the client's post request */ 
    obj = req.body; 

    //console.log("Obj: " + obj); 
    placeSearch.placeSearch(obj, function(error, data){ 
     /* send the data back to the client */ 
     res.status(200).send(data); 
    }); 
}); 

要支持,你placeSearch功能必须调用它的回调在适当的时候:

function placeSearch(obj, callback){ 

    /* all the stuff you do to assemble your data */ 
    // if (there_is_some_error): 
    if(err) return cb(err); 

    // when you have all your data available, no error has occurred 
    return cb(null, data); 
} 

别的东西,你可能会注意到的是,你的ar.map不会像你所期望的那样工作。 ar.map是一个同步函数,你在里面调用异步代码...不会像你想象的那样工作。这篇文章有点长,但你应该看看npm中的async库来管理一系列异步请求来收集一个组合结果。

0

使用回调你的代码看起来是这样的:

function placeSearch(obj,callback) { 

    console.log("Inside place search!"); 

    /** 
    * Place search - https://developers.google.com/places/documentation/#PlaceSearchRequests 
    */ 
    var arr = []; 
    var count = 0; 
    var rad = obj["radius"]; 

    console.log("radius: " + rad); 
    var loc = obj["location"]; 
    console.log("Location: " + loc); 
    var mode = obj["mode"]; 

    var params = obj["params"]; 

    /* client's keywords */ 
    var arr; 
    var ar = []; 
    for (var i = 0; i < params; i++) { 
     arr[i] = obj[i]; 
     console.log(arr[i]); 
     var param = { 
      location: loc, 
      radius: rad, 
      mode: mode, 
      keyword: arr[i] 
     }; 
     ar.push(param); 
    } 

    console.log("before promises"); 

    var promises = ar.map(function(name) { 
     return googlePlaces.placeSearch(name, function(response) { 
      arr.push(response); 
      console.log(response); 
      console.log(count++); 
      //If all responses have been returned 
      //Find combos and pass to distance-matrix 
      if (count == ar.length) { 
       var Matrix = new Array(); 
       var result = new Array(); 

       //to extract only lat and lng from arr.results 
       //Matrix = extract.extract(arr); 
       result = combination.combination(arr); 

       // NOW RESULT IS THE ARRAY OF ALL COMBINATION 

       // NOW RESULT IS THE ARRAY OF COMBINATIONS OF latlng pairs AND PASS IT TO FRONTEND 
       /*result.forEach(function(combo, index) { 
        console.log("combo" + combo) 
        DistanceMatrix.distanceMatrix(mode, combo, result.length); 
       });*/ 


       // IF YOU WANT TO SEE PERMUTATION 
       //permutation.permutation(result); 

       console.log("combination results: " + result); 

       callback(null,result); 
      } 

     }) 
    }); 

} 

在server.js:

server.post('/', function(req, res) { 
    /* get the object passed by the client's post request */ 
    obj = req.body; 

    //console.log("Obj: " + obj); 

    /* send the confirmation back to the client */ 
    res.status(200).send("body"); 
    placeSearch.placeSearch(obj,function(err,result){ 
     if(!err){ 
console.log(result); 
} 
}) 
}); 
0

好像你遇到与异步操作的麻烦。您需要return来自您的地方搜索模块的承诺。您还需要将回调从placeSearch转换为承诺。

编辑:自googlePlaces.placeSearch更新不返回一个承诺

placeSearch

function placeSearch(obj) { 
    //... 
    var promises = ar.map(function(name) { 
    var placeDefer = Q.defer(); 

    return googlePlaces.placeSearch(name, function(response) { 
     placeDefer.resolve(response); // or placeDefer.reject if a failure occurs 
    }); 
    return placeDefer.promise; 
    }); 

    return promises; 
} 

,并在您的路线:

// I'm going to just assume Q promise library here 
var Q = require("q"); 

server.post('/', function(req, res) { 
    /* get the object passed by the client's post request */ 
    obj = req.body; 

    //console.log("Obj: " + obj); 

    /* send the confirmation back to the client */ 
    res.status(200).send("body"); 

    Q.all(placeSearch.placeSearch(obj)) 
    .spread(function() { 
     var places = Array.prototype.slice.call(arguments); 

     // possibly call res.status(200).send("body"); here? 
     // only if you're trying to use the places in your response 
    }); 
}); 
+0

呀,尽管使用'VAR承诺=',它看起来没有什么实际上是一个承诺。 – Paul 2014-11-20 19:47:15

+0

我假设'googlePlaces.placeSearch'返回了一个承诺。 – 2014-11-20 20:35:11

+0

如果他使用的是npm模块,请不要使用它.https://www.npmjs.org/package/googleplaces – Paul 2014-11-20 21:18:30