从多个asynchronousfunction(承诺)收集数据

鉴于您必须从多个asynchronous函数或承诺获取数据的情况,收集和保存数据的最佳方法是什么? 一个示例情况是多个数据库查询需要在单个页面中呈现。

我遇到了下面的代码,这对我来说看起来像一个固定的模式,但是对于asynchronous游戏来说,新的东西是不确定的。

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 }); 

处理这种情况的最好办法是什么?

编辑澄清:必须在一系列,查询可能需要从前面的承诺结果的信息。

最简单的方法是使用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]}; }); */ } 

如果您需要按顺序执行查询(因为它们彼此依赖),请查看如何访问.then()链中的先前承诺结果? 在这里深入地解释了不同的策略(例如你的问题给出的策略,哪个策略不是很好 )。

最好的方法是将所有的承诺存储在一个数组中,并使用Q.all()或者我认为是完全相同的asynchronous运行,