我如何捕捉被拒绝的承诺?

时间:2018-07-24 11:29:11

标签: javascript promise

我的代码如下:

errorTest().then((result) => {

    try {
        console.log(result);
    }

    catch (err) {
        console.error("Error detected 1");
        console.error(err);
    }
}).catch((err) => {
    console.error("Error detected 2");
    console.error(err);
});

async function errorTest() {
    return new Promise((resolve, reject) => {
        reject("my error");
    })
}

当前,它显示“检测到错误2”。

我想使用try / catch捕获我的错误,以便代码显示“检测到错误1”。

我该如何修改我的代码?

3 个答案:

答案 0 :(得分:5)

首先,当您声明async函数时,这意味着您声明了一个返回Promise的函数。因此您无需通过新的Promise来改变它

你可以做

async function errorTest() {
  throw new Error("my error")
}

然后您可以使用try catch来捕获它

(async () =>{
  try{
    await errorTest()
  }
  catch(err){
    console.log(err)
  }

})()

然后完整的代码将如下所示

async function errorTest() {
  throw new Error("my error")
}

(async () =>{
  try{
    await errorTest()
  }
  catch(err){
    console.log(err)
  }

})()

答案 1 :(得分:0)

问题在于errorTest函数中引发错误,该错误首先发生,这意味着调用.catch函数而不是.then

async function errorTest() {
  return new Promise((resolve, reject) => {
    reject("my error");
  })
}

try {
  var result = await errorTest()
  try {
    console.log(result);
  } catch (err) {
    console.error("Error detected 2");
    console.error(err);
  }
} catch (err) {
  console.error("Error detected 1");
  console.error(err);
}

答案 2 :(得分:0)

您可以做这样的事情

//no need to make it async
function errorTest() {
    return new Promise((resolve, reject) => {
        reject("my error");
    })
}

async function test(){
  try{
    await errorTest();
    try{
      console.log(result);
      //try some syncronous task.
    }
    catch(e){
      console.error("Error detected 1");
      console.error(err);
    }
  }
  catch(err){
    //if promise returned by errorTest() is rejected; rejected value: err 
    console.error("Error detected 2");
    console.error(err);
  }
}

test(); //this also returns a promise though.

希望,这会有所帮助。