鉴于您必须从多个异步函数或承诺中获取数据的情况,收集和保留数据的最佳方法是什么,以便在完成后可以使用它。一个示例情况是需要在单个页面中呈现的多个数据库查询。
我遇到了下面的代码,对我来说看起来像一个固体模式,但对异步游戏不熟悉是不确定的。
function complexQuery(objectId) {
var results = {};
return firstQuery.get(objectId).then(function (result1) {
results.result1 = result1;
return secondQuery.find();
})
.then(function (result2) {
results.result2 = result2;
return thirdQuery.find();
})
.then(function (result3) {
results.result3 = result3;
return results;
});
}
complexQuery(objectId)
.then(function (results) {
//can use results.result1, results.result2, results.result3
res.render('dash', results); //example use
});
处理这种情况的最佳方法是什么?
编辑以供澄清:必须是连续的,查询可能需要来自先前承诺结果的信息。
答案 0 :(得分:2)
最简单的方法是使用Promise.all
,它可以并行执行查询:
function complexQuery(objectId) {
return Promise.all([firstQuery.get(objectId),
secondQuery.find(),
thirdQuery.find()])
.then(([result1, result2, result3] => {result1, result2, result3}); // ES6 syntax
/* ES5 equivalent would be
.then(function(results) {
return {result1: results[0], result2: results[1], result3: results[2]};
}); */
}
如果您需要按顺序执行查询(因为它们彼此依赖),请查看How do I access previous promise results in a .then() chain?其中不同的策略(例如您的问题中给出的策略,imo is not a good one)深入解释。
答案 1 :(得分:0)
最好的方法是将所有的promises存储在一个数组中并使用Q.all()或异步等效项,我认为在完成所有操作后运行函数是相同的