通常,如果我要运行多个mongoose查询,我会使用内置的promise来将它们链接在一起。在这种情况下,用户选择要搜索的模式。这可能是其中之一或两者兼而有之。以下示例使用post数据来定义要搜索的模式,如果一个模式为false,则应继续通过promise链。现在,在查询之前调用最终的承诺。
我的快速控制器中的示例:
app.post('/custom-search', function (req, res) {
var single = false
var multi = false
if(req.body.single){
var single = true
}
if(req.body.multi){
var multi = true
}
var promise = new Promise(function (resolve, reject) {
if(multi){
multiSchema.find({}, function (err, result) {
if(!err){
console.log(result);
resolve()
}
})
}else{
resolve()
}
}).then(function (value) {
if(single){
singleSchema.find({}, function (err, result) {
if(!err){
console.log(result);
resolve()
}
})
}else{
resolve()
}
}).then(function (value) {
console.log("done");
})
})
});
输出:
>done
>[singleResults]
>[multiResults]
完成应该打印最后,这是第一个问题。
答案 0 :(得分:0)
就像我们讨论的那样,很少有东西需要清理。首先实际使用并返回承诺,使其正常工作,其次,在您的第一个.then()
内创建一个小承诺,以解决并拒绝您的单个条件语句。第三,处理/捕捉承诺。
我写了一段代码的伪版本来说明我的观点,希望它可能有很好用。
app.get('/custom-search', function (req, res) {
// Manipulating values to test responses
var single = false;
var multi = true;
var promise = new Promise(function (resolve, reject) {
if (multi) {
setTimeout(function () {
resolve('MULTI RESOLVED!');
}, 3000);
} else {
reject('MULTI REJECTED!');
}
})
.then(function (value) {
new Promise(function (resolve, reject) {
if (single) {
setTimeout(function () {
resolve('SINGLE RESOLVED!');
}, 3000);
} else {
reject('SINGLE REJECTED!');
}
})
.catch(function (error) {
console.log('SINGLE ERROR!', error);
})
.then(function (value) {
console.log('SINGLE DONE', value);
});
})
.catch(function (error) {
console.log('MULTI ERROR!', error);
});
return promise;
});