在NodeJS中用q.all命名承诺结果

我有点新东西,我发现它非常棒,但有些东西我仍然无法弄清楚。

我设法通过传递q.all一个q.all数组来运行一些联合的promise。 像这样的东西

 var promises = [promiseOne(), promiseTwo()]; q.all(promises).then(function (results) { res.send(results); } ); 

事情是这样的,我真的希望这些承诺被命名,所以我不必依靠承诺的顺序。

我读了一个地方,你实际上可以传递一个对象到q.all ,以得到命名的结果。 所以这将是这样的:

 var promises = { promiseOne: promiseOne(), promiseTwo: promiseTwo() } q.all(promises).then(function(results){ res.send(results); }); 

但我想这只是不像发送数组一样,因为我没有得到我的承诺的结果在那里。 我得到的结果类似于这个:

 { promiseOne: { source: {} }, promiseTwo: { source: {} } } 

那么你怎样才能从q.all得到命名结果呢?

有一件事要注意的是,我将在promises数组中promises数量并不是固定的,因为我通过从用户发送到我的函数的GET参数得到了这个数字。

此外,在我的每一个承诺,我有承诺的另一个数组(或对象)被parsing,其结果我也想命名。

这是另外一种编写Roamer用你要求的function编写的代码的方法(返回一个对象):

 Q.props = obj => { const ps = Q.all(Object.keys(obj).map(x => Q.all([x, obj[x]]))); return ps.then(x => x.reduce((p, c) => {p[c[0]] = c[1]; return p } , {})); }; 

哪个可以让你做到:

 Q.props(promises).then(o => { o.promiseOne }); 

虽然你应该考虑使用蓝鸟,如果你想要所有这些帮助function。

Q.js似乎不提供Q.all(object) ,因此在传递给Q.all()之前,需要将对象映射到数组。

像这样的东西将是可重复使用和方便的:

 Q.allObj = function (obj) { var array = Object.keys(obj).map(function(key, i) { try { //expect a promise return obj[key].then(function(value) { return {key: key, value: value}; }); } catch(e) { // whoops it was a value return {key: key, value: obj[key]}; } }); return Q.all(array); }; 

使用方法如下:

 Q.allObj(myObj).then(function(results) { results.forEach(function(obj) { var name = obj.key; var value = obj.value; ... }); });