mongooseasynchronous请求pipe理

我实际上是试图将mongodb引用转换为这些引用的文档值(info.value)在JavaScript中使用mongoose。

试图通过使用地图,for / forEach,没有做任何工作,因为mongoose的请求是asynchronous的。

不是真的习惯了这种代码,在我尝试过的所有事情之后,我感觉有点失落。

也许有人想看看下面的代码给我一个暗示。

只是为了提供信息,不需要担心加载模板,连接到mongo,因为一切正常工作。

这是最接近预期的结果,但仍然,当我尝试“ console.log(cond [c]); / console.log(信息); ”(cond [c]和信息为空和未定义)

那么这个函数也需要做好recursion的准备,因为我打算把子块放到块对象的“内容”属性中。

非常感谢你的时间。

// Input condition "H1Vf3KTef || false" // Expected result "1 || false" // Buggy Function var execIfBlock = function recursExec (query, callback) { IfBlockModel.findOne(query, function(err, ifBlock) { if (!err) { var cond = ifBlock.condition.split(" "); //console.log('Block : ' + ifBlock); //console.log('Condition : ' + cond); var calls = new Array(); for (var c = 0, len = cond.length; c < len; c++) { if (shortId.isValid(cond[c])) { calls.push(function() { InfoModel.findOne({ _id: cond[c] }, function(err, info) { console.log(cond[c]); console.log(info); cond[c] = info.value; }); }); } } async.parallel(calls, function(err, result) { console.log(result); // Do some job using the final expected result : "1 || false" }); } }); }; // Info template { "_id": "H1Vf3KTef", "value": "1" } // Bloc template { "_id": "rkRBtLTef", "content": [], "condition": "H1Vf3KTef || false" } // Info schema var InfoSchema = new Schema({ _id: { type: String, unique: true, required: true, default: shortId.generate }, value: { type: String, default: "0" } }); // Bloc schema var IfBlockSchema = new Schema({ _id: { type: String, unique: true, required: true, default: shortId.generate }, condition: { type: String, required: true, default: true }, content: [{ type: String, required: true, default: '', ref: 'block' }] }); 

使用promise并在小函数中打破你的代码:

 var execIfBlock = function recursExec(query, callback) { IfBlockModel.findOne(query, function (err, ifBlock) { if (!err) { var cond = ifBlock.condition.split(" "); updateMultipeInfo(cond) .then(values => { console.log(values) // [values1, values ,...] }); } }); }; function updateMultipeInfo(cond){ return Promise.all(cond.map(updateInfo)) } function updateInfo(id){ if (shortId.isValid(id)) { return InfoModel .findOne({ _id: id }) .then(info => info.value); } else { return Promise.reject("invalid id"); } }