使用mongodb保存node.js的异步特性的多个数据
saving multiple data with async nature of node.js with mongodb
我有一个id数组:
var ids = ['53asd3','53asd2','53asd5'];
每个id在mongodb中都有对应的文档。我想通过从每个文档中填充数据来生成一个对象,并将其保存在其他文档中。像这样:
{
person: { /* data from some collection populated with first id */},
company : { /* data from some collection populated with first id */},
employee : {/* data from some collection populated with first id */}
}
我做了什么
var document = {}
models.persons.find({_id:'53asd3'},function(err,data){
if(!err) {
document['persons']=data;
models.company.find({_id:'53asd2'},function(err,data){
if(!err) {
document['company']=data;
models.employee.find({_id:'53asd2'},function(err,data){
if(!err) {
document['employee']=data;
document.save(function(err){ });
}
});
}
});
}
});
所以我只是使用嵌套调用使用回调,并使其同步。是否有可能并行执行所有这三个查找查询,然后执行保存命令?我想利用node.js的异步特性。有什么建议吗?
如果您不想包含外部库,您可以自己构建类似async.parallel
的东西。下面是一个简单的parallel
函数。在async
库中实现其他函数可能是一个很好的练习。
var parallel = function () {
var functs = arguments[0];
var callback = arguments[1];
// Since we're dealing with a sparse array when we insert the results,
// we cannot trust the `length` property of the results.
// Instead we count the results separately
var numResults = 0;
var results = [];
var getCallback = function (i) {
return function (err, res) {
if (err) {
callback(err)
}
else {
results[i] = res;
numResults += 1;
if (numResults === functs.length) {
callback(null, results);
}
}
}
}
functs.forEach(function (fn, i) {
fn(getCallback(i));
});
};
var getTest = function (timeout) {
return function (callback) {
setTimeout(function () {
callback(null, timeout);
}, timeout);
}
};
parallel([getTest(99), getTest(1000), getTest(199)], console.log.bind(console));
>> null [99, 1000, 199]
在你的情况下,你可以这样做
var findItem = function (collection, id) {
return function (callback) {
collection.find({
_id: id
}, callback);
};
};
parallel([
findItem(models.persons, '53asd3'),
findItem(models.company, '53asd2'),
findItem(models.employee, '53dsa2')
], function (err, results) {
document.persons = results[0];
document.company = results[1];
document.employee = results[2];
document.save(function (err) {
// and so on
});
});
相关文章:
- 异步获取数据使用JavaScript同步获取数据
- 从要使用Protractor测试的服务器异步加载的动态数据列表的列表
- 将数据发布到iframe是同步还是异步
- 如何处理异步获取的数据
- Javascript/JQuery处理并发/异步调用和数据竞争
- 在我的案例中,如何获取异步数据
- 将数据注入异步回调(使用 node.js)
- 嵌套异步函数未及时返回数据的问题
- 如何将状态对象/数据传递给(异步)ajax 回调
- 如何等到异步回调完成后才能使用检索到的数据
- 使用从内部函数返回的异步数据对外部函数返回promise
- 异步循环使用递归:如何访问推送数组数据
- 在呈现“页面”之前异步获取数据
- 如何访问回调函数之外的异步angularjs服务数据
- 余烬数据异步关系的聚合
- 从Json数据异步加载谷歌地图标记
- 为什么Javascript检索数据异步(ajax,..),而PHP同步(mysql_query)
- 使用存储中的数据异步请求
- 如何在 AngularJS 中将数据异步从模型返回到控制器
- 想创建一个js插件,发送大量的数据异步到另一个服务器