2016-01-07 70 views
1
的NodeJS

q.all我有点新本q的东西,我觉得它非常真棒,但有些事我还是想不通。命名承诺结果与

我设法通过q.all传递一些承诺,与q.all合作承诺。像这样的东西..

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阵列中承诺的金额不是固定的,因为我从用户发送给我的函数的GET参数中获得了这一点。

而且,里面我的每一个承诺,我承诺的另一个阵列(或对象)来解决,其结果,我想被命名为好。

+0

我不认为你可以将一个对象作为输入传递给'Q.all',而'Q.all'的结果总是会是一个数组 – thefourtheye

+0

@thefourtheye下面是我发现http:// blog的地方。 500tech.com/really-you-can-do-that-with-promises/在#2的情况下,他似乎正在这样做(并不是说这是一个值得信任的资源)。此外,在q的Angular文档中,它声明promise可以是一个对象https://docs.angularjs.org/api/ng/service/$q。不知道AngularJS的q与Node的相同。 – lascort

+0

的[Q.js文档】(https://github.com/kriskowal/q/wiki/API-Reference)给出指示,'Q.all()'将代替的阵列的接受的对象。作为解决方法,我建议您找到一种方法,将必需的名称作为每个承诺解决的价值的一部分。 –

回答

3

这里是另一种方式来写漫游者与你要求的功能写的代码(返回一个对象):

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

虽然你应该考虑,如果你想所有这些辅助功能使用蓝鸟。

+0

不错!不知道蓝鸟!使用蓝鸟vs q的任何缺点? – lascort

+0

@lascort它是一个更新的库 - 所以就是这样。 Q有一个更可读的来源。就是这样。 –

+0

完美!刚刚与蓝鸟合作!感谢你的真棒。我不认为接受这个答案是好的,因为它实际上并不暗示蓝鸟。但是如果你发布一个答案,绿色的东西就是你的。 – lascort

1

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