Node.js:相互依赖的回调值
Node.js: callback values depending on each other
假设我想用 map 函数转换数组,每个值都在 mongoDB 中用 findOne 查找,其条件又取决于数组的当前值。换句话说,只需将 id 数组转换为从数据库中获取的相应对象。喜欢:
arr.map(function(v) {
collection.findOne({_id: v}, function(
?
});
return {newField: ?};
});
问号是需要填写的地方,但我想整个结构需要改变。希望我已经清楚了。
我不习惯这种回调思维,无法理解它,我是不是漏掉了什么明显的东西?
我不是 MongoDB 方面的专家,但您可以在 collection
行之前设置一个变量,如下所示:
var return_element; var are_we_done = false;
collection.findOne({_id: v}, function(
// assign value to return_element
are_we_done = true;
)};
while (!are_we_done) {}
return {newField: <value of variable> };
您可以使用 async
library to perform an asynchronous map
, but in this case it would be easier and faster to use the $in
运算符让 MongoDB 一次性获得它们:
collection.find({_id: {$in: arr}}).toArray(function(err, docs) {
// docs contains the docs with the _id values that were in arr
});
假设我想用 map 函数转换数组,每个值都在 mongoDB 中用 findOne 查找,其条件又取决于数组的当前值。换句话说,只需将 id 数组转换为从数据库中获取的相应对象。喜欢:
arr.map(function(v) {
collection.findOne({_id: v}, function(
?
});
return {newField: ?};
});
问号是需要填写的地方,但我想整个结构需要改变。希望我已经清楚了。
我不习惯这种回调思维,无法理解它,我是不是漏掉了什么明显的东西?
我不是 MongoDB 方面的专家,但您可以在 collection
行之前设置一个变量,如下所示:
var return_element; var are_we_done = false;
collection.findOne({_id: v}, function(
// assign value to return_element
are_we_done = true;
)};
while (!are_we_done) {}
return {newField: <value of variable> };
您可以使用 async
library to perform an asynchronous map
, but in this case it would be easier and faster to use the $in
运算符让 MongoDB 一次性获得它们:
collection.find({_id: {$in: arr}}).toArray(function(err, docs) {
// docs contains the docs with the _id values that were in arr
});