0

Node.js で、HTTP 要求の .save 関数である Mongoose を使用して関数を作成しようとしています。地理座標を抽出して、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);
    });
}
4

1 に答える 1

1

コールバックを呼び出すcallback(null, articles);前にコールバックをgeocode呼び出しています。コールバックを呼び出す前に、これらすべてが終了していることを確認する必要があります。私は通常Caolan の async (参考文献を参照async.forEach) などの非同期ライブラリをお勧めしますが、1 つのケースではやり過ぎになる可能性があります。私は提案します:

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();
    }
  }
};

ブラケットの不一致も修正しました。これは、コピー/貼り付けエラーであると想定しています。

于 2013-01-30T04:21:06.120 に答える