【问题标题】:In catch function a rejected promise is returned but a resolved promise is not?在 catch 函数中,返回了一个被拒绝的承诺,但没有返回一个已解决的承诺?
【发布时间】:2019-07-03 18:42:19
【问题描述】:

我的函数caller 调用了一个函数parent,它本身又调用了child。如果child出现错误,则需要返回caller

当我 reject 承诺这有效,但是当我尝试返回承诺 resolve 时,它不会返回到 caller

function caller() {
  return parent()
}       

async function parent(){
  const child = await foo(
    // more code
  ).catch(error=>{
    if(error === 123) {
      return Promise.resolve("This was resolved"); 
    }
    return Promise.reject("This was rejected");
  })
}

我认为 try / catch 块会起作用,但我更喜欢上面的语法。

【问题讨论】:

  • 您正在混合使用 async/await 语法和 .then().catch() 语法。您可以使用其中一种,但不能同时使用。如果你使用 async/await,你需要一个 try-catch 来捕捉 promise 的拒绝。另外我认为你的代码不会工作,因为你的函数不是异步的(如果你想在函数块中使用awaitfunction parent() 应该是async function parent()
  • 因为您的 parent() 函数不返回任何内容,尤其是 const child。但是错误会在调用堆栈中冒泡。
  • try..catch 代替await 怎么样? stackoverflow.com/a/44664037/2275797 它会更容易阅读,即使对于那些不习惯 javascript 的人来说也是如此。

标签: javascript promise


【解决方案1】:

问题是您没有从parent 返回child

这是一个简单的例子,

function caller() {
    return parent()
}

 async function parent() {
    const child = await foo()
    .catch(error => {
        if (error === 123) {
            return Promise.resolve("This was resolved");
        }
        return Promise.reject("This was rejected");
    })
    return child;
}

function foo(){
    return Promise.reject(123);
}
caller().then(console.log);//This was resolved

注意: 再一次将async/awaitthen/catch 混合是完全不推荐的。但我认为显而易见的原因是可读性。

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2016-08-19
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多