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