【问题标题】:Chaining promises but continue with the next promise when one fails (and log the rejection)链接承诺,但在一个失败时继续下一个承诺(并记录拒绝)
【发布时间】:2016-11-20 10:59:59
【问题描述】:

我有许多函数存储在一个数组中。 基本上我有两个问题。

  1. 如何将此函数数组转换为链式 Promise。 (一个长数组) 类似的东西: funcs.reduce((prev, cur) => prev.then(cur), starting_promise);

    var promise = funcs[0](input); for (var i = 1; i < funcs.length; i++) promise = promise.then(funcs[i]);

  2. (这是主要问题)当链中的承诺之一拒绝时,希望承诺链不拒绝。而是继续下一个,直到它到达最后一个。 (如果可能的话,也可以捕捉到拒绝,所以我可以输出出了什么问题)

【问题讨论】:

    标签: javascript promise


    【解决方案1】:

    您可以在reduce 回调中处理拒绝;

    funcs.reduce((prev, cur) => prev.then(cur).catch(log), starting_promise)
    

    或者您可以预处理函数数组:

    funcs.map(f => v => f(v).catch(log)) 
      .reduce((prev, cur) => prev.then(cur), starting_promise)
    

    在任何一种情况下,关键是catch 将承诺重新置于成功轨道上,就像原来一样(除非你在 catch 处理程序中抛出)。

    请注意,catch 处理程序返回的任何内容都将成为 Promise 链中下一个函数的输入值。如果您希望拒绝原因成为输入,则从catch 处理程序返回:

    function log(reason) {
      console.log("rejected with reason", reason, "continuing...");
      return reason;
    }
    

    来自评论:

    如何在 catch -> log 函数中使用 cur 引用?

    不只是将log 传递给catch,而是传递一个调用log 的函数,其中包含原因和函数:

    funcs.reduce(
      (prev, cur) => prev.then(cur).catch(reason => log(reason, cur)), 
      starting_promise)
    
    function log(reason, func) {
      console.log("rejected with reason", reason, "in function", func, "continuing...");
      return reason;
    }
    

    【讨论】:

    • @Phoelpis 请记住,cur 不是一个承诺,而是一个返回承诺的函数。也许您的意思是将调用cur 产生的promise 的拒绝原因传递给log 函数?好吧,实际上它已经会了。对不起,如果我不明白你的问题。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2013-11-25
    • 2018-02-11
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多