Javascript 链接承诺,但在一个承诺失败时继续下一个承诺(并记录拒绝)

Javascript 链接承诺,但在一个承诺失败时继续下一个承诺(并记录拒绝),javascript,promise,Javascript,Promise,我有许多函数存储在一个数组中。 基本上我有两个问题 如何将此函数数组转换为链接承诺。(长数组) 类似于: funcs.reduce((上一个,当前)=>prev.then(当前),起始值) 或 var promise=funcs[0](输入); 对于(var i=1;ilog函数中使用cur引用 不只是将log传递给catch,而是传递一个调用log的函数,该函数包含原因和函数: funcs.reduce( (prev, cur) => prev.then(cur).catch(rea

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

  • 如何将此函数数组转换为链接承诺。(长数组) 类似于:
    funcs.reduce((上一个,当前)=>prev.then(当前),起始值)
    

    var promise=funcs[0](输入);
    对于(var i=1;i

  • (这是主要问题)希望当链中的一个承诺被拒绝时,承诺链不会拒绝。而是继续下一个,直到最后一个。(如果可能,还可以捕获拒绝,以便输出出错的内容)


  • 您可以在
    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
    处理程序返回的任何内容都将成为承诺链中下一个函数的输入值。如果希望拒绝原因成为输入,则从
    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
    产生的承诺的拒绝原因传递给
    log
    函数?嗯,实际上已经是了。对不起,如果我不明白你的问题。