【问题标题】:Need correct call to Promise reduce (when.reduce )需要正确调用 Promise reduce (when.reduce )
【发布时间】:2017-03-08 02:28:01
【问题描述】:

我有一个处理器函数,它接受一个“cmd”对象并返回一个承诺,其中分辨率与传入的“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,但承诺数组永远不会触发,永远不会看到调试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 示例没有给我任何见解。

重要更新: 下面的答案确实有效,但会引发未处理的拒绝错误。罪魁祸首是when库。它似乎不再处于活动状态,并且自节点 6 以来一直没有更新。我切换到 bluebird,它工作正常,无需对下面概述的代码进行任何更改。

【问题讨论】:

  • 似乎有些不对劲,您是否使用 processor(cmd) 应该返回下一个 processor?因为这就是reduce() 通常的工作方式
  • 处理器不会解析传递的对象。我正在寻找一系列承诺,这些承诺允许我传入同一个对象,但 on 键具有不同的值。我确实有一个解决方案,但正在寻找更优雅的东西,但也许 when.reduce 不是。看看我的帖子把我带到了这里。 stackoverflow.com/questions/40206604/…

标签: promise bluebird when-js


【解决方案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

【讨论】:

  • 一种将一组不同输入(实际上是相同的对象,在每种情况下具有不同值的键)传递给返回承诺的处理器函数的方法。它必须按顺序运行,否则它将锁定我的串行端口(即不能使用 when.all)。当序列只允许对所有调用进行相同的输入时,这就是我寻找其他东西的原因。
  • @DKebler cmds 是一个输入数组,每个cmd 都被传递给processor?似乎正是您想要的。
  • 通过解析我的响应而不是以响应为键的对象来按原样工作!!!。但是工作和理解是两个不同的东西。我不理解 array.reduce 的等价性,developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…“Reduce 的工作原理”示例。什么时候文档可以更好地解释这些论点……第三个论点 [] 是关于什么的? @bergi 你是我特别的外星人存在! thx...又一次。
  • 数组reduce的唯一区别是回调返回一个promise,而不是一个普通的值,累加器(responses在上面的例子中)将是这个promise的结果。第三个参数是起始值。
  • “reducer”函数的第二个参数是理解的关键。 reducer 的第一个 arg 将在迭代之间传递(解释 [],第三个 argl),第二个 arg 是承诺、值或在我的情况下正在“减少”的对象的数组的当前元素。在我的情况下,像“处理器”这样的函数只需要在我的错误/困惑的未传递的范围内。在我的例子中,您可以通过将承诺分辨率累积到数组中来做任何事情,就像 when/sequence 一样。减速器功能的文档可能会更清楚。
猜你喜欢
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多