我正在创建一个JSON对象数组,然后将其存储在mongodb中。每个JSON对象都包含许多字段-每个字段都是在我将对象保存到mongodb之前填充的。
一些对象属性是通过对其他网站(如last.fm )进行API调用来填充的,但是在对象保存到mongodb之前,返回的值不足以填充属性。
如何在保存对象之前等待对象的所有属性都被填充?我确实尝试过async.waterfall,但它仍然没有等待就失败了,我最终得到了一个数据库,其中充满了带有空字段的文档。
任何帮助都将不胜感激。谢谢:)
发布于 2014-09-18 04:06:13
发布于 2014-09-18 06:46:15
由于您说您正在对其他网站进行多个API调用,因此您可能想要尝试:
async.each(api_requests,
function(api_request, cb) {
request(api_request, function (error, response, body) {
/* code */
/* add to model for Mongo */
cb();
});
},
function(err) {
// continue execution after all cbs are received
/* code */
/* save to Mongo, etc.. */
}
);以上示例最适用于发出多个相同格式的请求的情况。如果下一步的输入依赖于上一步的输出,请查看瀑布(https://github.com/caolan/async#waterfall)文档;如果有一堆互不相关的任务,请查看并行(https://github.com/caolan/async#parallel)。异步的伟大之处在于,你可以将所有函数嵌套在一起,并将它们串在一起,以支持你想要做的事情。
发布于 2014-09-18 03:51:41
您可能希望使用promises或某种回调机制。下面是一个使用jPromise的promise方法的示例
var jPromise = require('jPromise');
var promises = [];
for(var i = 0; i < 10; i++) {
promises.push(someAsyncApiCall(i));
}
jPromise.when(promises).then(function() {
saveThingsToTheDb();
});同样,如果没有promise库:
var finished = 0;
var toDo = 10;
function allDone() {
saveThingsToTheDb();
}
for(var i = 0; i < toDo.length; i++) {
someAsyncApiCall(function() {
finished++;
if(finished === toDo) {
allDone();
}
});
}就我个人而言,我更喜欢promise方法,但只有当您调用的API返回某种promise时,它才会更好。如果没有,你将会被解决,并以某种方式用promises (Q does this pretty well)包装回调API。
https://stackoverflow.com/questions/25897011
复制相似问题