用于在javascript中同步的回调函数

时间:2013-01-30 03:28:02

标签: javascript node.js callback mongoose geocode

我正在尝试使用Mongoose在Node.js中创建一个函数,该函数是HTTP请求的.save函数,我正在尝试提取地理坐标并将它们保存为MongoDB中的Mongoose模式中的数组。但是,似乎我有一个同步问题,因为坐标首先打印为未定义,我必须刷新页面才能显示它们。我认为回调可以解决这个问题,但他们没有。 (我在下面添加了相关的代码片段。)我在回调时做错了什么或者我应该做些什么?提前谢谢!

ArticleProvider.prototype.save = function(articles, callback) {
for( var i =0;i< parties.length;i++ ) {
    article = articles[i];
    article._id = articleCounter++;
    article.created_at = new Date();
if (article.coords === undefined){
      geocode(article.address, function(results){
        article.coords = results;
      });
}
 callback(null, articles);
};

var geocoder = require('Geocoder');
function geocode(address, callback) {
    geocoder.geocode( address, function( err , data) {
         // console.log(data.results[0].geometry.location);
          //console.log( [data.results[0].geometry.location.lng, data.results[0].geometry.location.lat]);
          var coords = [data.results[0].geometry.location.lng, data.results[0].geometry.location.lat];
        console.log(coords);
        callback(coords);
    });
}

1 个答案:

答案 0 :(得分:1)

callback(null, articles);调用其回调之前,您正在调用回调geocode。在调用回调之前,您需要确保完成所有这些操作。我通常会推荐一个异步库,例如Caolan's async(查看async.forEach),但对于一个可能有点过分的案例。我建议:

ArticleProvider.prototype.save = function(articles, callback) {
  var finishedCount = 0;
  var finishedOne = function() {
    finishedCount++;
    if(finishedCount == parties.length)
      callback(null, articles);
  };
  for( var i =0;i< parties.length;i++ ) {
    article = articles[i];
    article._id = articleCounter++;
    article.created_at = new Date();
    if (article.coords === undefined){
      geocode(article.address, function(results){
        article.coords = results;
        finishedOne();
      });
    }
    else {
      finishedOne();
    }
  }
};

我还修复了支架不匹配问题,我认为这是一个复制/粘贴错误。