【问题标题】:How to break promise chain nested into another promise chain如何打破嵌套到另一个承诺链中的承诺链
【发布时间】:2019-05-10 23:48:02
【问题描述】:

我无法弄清楚如何将嵌套的 Promise 链分解为主 Promise 链。这是我的代码:

 //Main Promise chain
 let promiseMain = Promise.resolve(1)
        .then(result => functionA())
        .then(result => nestedChain()).catch((error) => {
            console.log(error);
        })
        .then(result => functionC())

//chain error handler
function chainError(err) {
return Promise.reject(err)
};

function nestedChain()
{
stepOne()
.then(stepTwo, chainError)
.then(stepThreee, chainError)
.catch((error) => 
    {
        console.log(error);
        return undefined;
    });          
}

function stepOne() 
{
    return chainError("error attempt : 1.00");
}

一旦我进入我在 stepOne() 中抛出错误的嵌套链,我就能够打破这个嵌套链。惊人的!

问题:它还破坏了主要的承诺链。所以.. 当它进入nestedChain() 并且从stepOne() 抛出错误时,主promise 链中的functionC 将永远不会被执行,因为来自nestedChain 的被拒绝的promise 也会破坏这条链。

【问题讨论】:

  • Promises 不会抛出 - 您正在考虑 async/await 所表现出的行为
  • 这解释了我的 try/catch 失败,谢谢!但是仍然..是否可以仅在嵌套链中中断?

标签: node.js typescript promise


【解决方案1】:

你必须附加承诺链,做这样的事情

function nestedChain()
{ 
  stepOne()
  .then(stepTwo, chainError)
  .then(stepThreee, chainError)
  .catch ((error) => {
               console.log(error);
               return undefined;
            })
}

【讨论】:

  • 我通过在 stepOne() 中抛出一个错误来尝试这个,我得到一个未处理的拒绝,并且所有的东西都破坏了主链。
  • 贴出你的完整代码,错误一定是在别处抛出,如果可能的话附上错误日志
【解决方案2】:

Promise 的实现是为了等待需要更多时间的事情。你只需要正确地实现promise。

例如,如果我们有 3 个函数返回承诺,一个嵌套函数也返回承诺,这就是它的实现方式:

functionA()
.then( result => {
    return functionB();
})
.then( result => {
    return nestedFunct();
})
.then( result => {
    return functionC();
})
.then( result => {
    console.log(result);
})
.catch( error => {
    console.log(`Error in one of the above function`);
});

所有功能的格式也相似

function functionA() {
    return new Promise( (resilve, reject) => {
        resolve('something');
        // or
        reject('Error');
    });
}

嵌套函数可以这样

function nestedFunc() {
    return functionD()          // Return promise
    .then( result => {
        return functionE();     // return promise
    })
    .then( result => {
        return functionF();      // return promise or value
    });
}

主 Promise 链不受单个函数所做的影响,只要它们不断返回 Promise。所有单个函数都可以有一个本地承诺链。即使嵌套链发生错误,也会被主 Promise 链中的catch() 捕获。

【讨论】:

    【解决方案3】:

    如果我理解你是正确的,你需要在嵌套链承诺之后捕获错误

    Promise.resolve().then(()=> {
      console.log('A');
    }).then(() => {
      return Promise.resolve().then(() => {
        console.log('step 1');
      }).then(() => {
        console.log('step 2');
        throw new Error('Step 2 error');
      });
    }).catch((err) => {
      console.log(err);
    }).then(() => {
      console.log('C');
    });
    

    【讨论】:

    • 如果我发现错误,代码仍在运行,它不会破坏嵌套链。此外,如果我发现从嵌套链抛出到主链的错误,主链不会捕获任何东西。
    • 父链可以从嵌套链的抛出错误中捕获错误。你真正想做的是什么。我对你的评论感到困惑:)
    猜你喜欢
    • 2020-02-23
    • 2017-11-23
    • 1970-01-01
    • 2015-08-21
    • 2013-11-25
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多