我正在尝试使用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);
});
}
答案 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();
}
}
};
我还修复了支架不匹配问题,我认为这是一个复制/粘贴错误。