2016-10-25 79 views
1

我有一個處理函數,它接受一個「cmd」對象,並返回一個承諾,其中的解析與傳入的cmd對象相同(添加了響應鍵)。 reduce這裏是when.reduce需要對Promise的正確調用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的例子沒有給我任何見解。

重要更新: 答案下面的工作,但拋出未處理的拒絕錯誤。罪魁禍首是何時圖書館。它似乎不再活躍,並且自從節點6以來沒有更新過。我切換​​到藍鳥並且它工作正常,沒有改變下面列出的代碼。

+1

有些東西看起來不正確,你用'processor(cmd)'是否應該返回下一個'processor'?因爲'reduce()'通常是這樣工作的 –

+0

處理器不會這樣做,它會解析傳遞的對象。我正在尋找一系列的承諾,允許我傳入同一個對象,但使用具有不同值的鍵。我確實有一個解決方案,但正在尋找更優雅的東西,但可能when.reduce不是。看到我的帖子,把我帶到這裏。 http://stackoverflow.com/questions/40206604/a-better-way-to-fire-off-a-sequence-of-the-same-promise-that-have-gets-different – DKebler

回答

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

+0

一種傳遞數組的方法不同的輸入(實際上是同一個對象,每個鍵的值都不同),這個函數返回一個promise。它必須按順序運行,否則會鎖住我的串口(即不能使用when.all)。當序列只允許相同的輸入到所有的調用,這就是爲什麼我正在尋找別的東西。 – DKebler

+0

@DKebler'cmds'是一個輸入數組,每個'cmd'都被傳遞給'processor'?似乎正是你想要的。 – Bergi

+0

的工作原理是通過解析我的響應而不是將響應作爲關鍵字的對象。但作品和理解是兩回事。我不是在等同於array.reduce,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce「How Reduce Works」的例子。什麼時候的文檔可以更好地解釋這些論點......什麼是第三個參數[]? @bergi你是我特別的外星人存在! thx ...再次。 – DKebler