geturls(data,function(urls){
var data = {
"data": [
{ "userProfile": userP },
{ "urls": urls }
]
};
res.send(data);
});
function getUrls(data,done){
links = new Array();
for (var i=0; i<data.length; i++){
user = data[i]
Url.find({where:{data.id}}).success(function(url){
links.push({
"url": ur.text,
"date": data.syncedTime
});
if (urls.length == data.length){
done(links);
}
});
}
}
我的代码的问题是这样的:
一旦数组中收集的数据等于父数组的长度,我将通过回调返回响应。这显然是一个非常危险且不太优雅的解决方案。假设我从 Url 数据库收到 .failure,那么我的 urls.length 将不等于 data.length。所以,我有点困惑如何去做这件事。 有什么帮助吗?
最佳答案
如果您使用async.js
,这对您来说会很容易.
我用了mapSeries
这里。它需要 3 个参数。
- 集合/数组
- 迭代器,将为传递的集合/数组中的每个项目调用两个参数。 1. 集合中的项目,2. 回调。在迭代器中完成工作后,您应该以 Node 样式调用回调(先出错,然后结果)。
- 最终回调,将在映射集合中的所有项目后调用。
function getUrls(data,done){
var async = require('async');
async.mapSeries(data, function(user, cb) {//If you want it to be async `async.map`
Url.find({where:{user.id}}).success(function(url){
cb(null, {
"url": url.text,
"date": user.syncedTime
});
});
}, function(err, results) {
//results is an array. Its the same as `links` in your old code.
done(results);
});
}
geturls(data,function(urls){
var data = {
"data": [
{ "userProfile": userP },
{ "urls": urls }
]
};
res.send(data);
});
关于javascript - 如何从 JavaScript 中查询数据库的 for 循环返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17377324/