需要正确调用Promise reduce(when.reduce)

时间:2016-10-25 21:35:53

标签: promise bluebird when-js

我有一个处理器函数,它接受一个“cmd”对象并返回一个promise,其中分辨率是传入的“cmd”对象(添加了响应键)。 reduce这里是when.reduce

 reduce = require('when').reduce;

  //return processor(cmds[0])
 return reduce(cmds, function(processor, cmd) {
     Debug.L1('running processor for component ', cmd.component)
     return processor(cmd)
   })
   .then(cmds => {
     Debug.L1('cmds with responses\n', cmds)
     let response = cmds.map(cmd => {
       return cmd.response
     })
     console.log('the complete response is\n', response)
   });

这没有任何作用,它确实到达.then但是promises数组永远不会触发,永远不会看到Debug running processor...

如果我只运行一个处理器,它可以很好地运行cmd [0],cmds [1]等。

return processor(cmds[0])
//return reduce(cmds, function(processor,cmd) {
//       Debug.L1('running processor for component ', cmd.component)
//   return processor(cmd) })

我在这里缺少什么?他们的api和wiki例子并没有给我任何见解。

重要更新: 下面的答案确实有效,但会抛出未处理的拒绝错误。罪魁祸首是图书馆。它似乎不再活动,并且自节点6以来没有更新。我切换到蓝鸟,它工作正常,没有对下面列出的代码进行任何更改。

1 个答案:

答案 0 :(得分:1)

我仍然不确定你在寻找什么,但它可能是

reduce(cmds, function(responses, cmd) {
    return processor(cmd).then(function(response) {
        responses.push(response); // or whatever
        return responses;
    });
}, []).then(function(responses) {
    …
});

在尝试理解when.reduce之前,您可能需要查看非承诺array reduce