为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Chrome 在我清楚地处理它时告诉我我有一个未处理的拒绝?

为什么 Chrome 在我清楚地处理它时告诉我我有一个未处理的拒绝?

潇湘沐 2021-10-14 15:47:14
我正在为 Javascript 承诺使用“延迟”模式,它允许我将承诺返回给调用函数,然后在稍后的时间,在某些条件下,解决或拒绝该承诺。正如您在我提供的代码中所看到的,除了在浏览器中出现Unhandled Rejection错误之外,一切都按预期工作。function promiseGenerator() {  const deferred = {};  const promise = new Promise((resolve, reject) => {    deferred.resolve = resolve;    deferred.reject = reject;  });  deferred.promise = promise;  return deferred;}const generatedPromise = promiseGenerator();generatedPromise.promise.then(res => {  console.log("A string deferred resolved!", res);});generatedPromise.promise.then().catch(e => {  console.log("This is the catch", e);});generatedPromise.reject("Oh no");我期待This is the catch Oh no在控制台中看到- 我确实做到了。但是为什么我会收到错误消息?显然,我的拒绝是被处理!请注意,我不想(必然)想要将捕获链接到,then因为我可能想在代码中的其他地方单独添加这个捕获这是一个 Codesandbox 链接 https://codesandbox.io/embed/deferred-promise-catch-vanilla-pjor9
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

Promise 拒绝不会在.then()回调中处理,当您then()首先附加回调并且承诺被拒绝时,错误被认为是未处理的,因为没有catch()跟随then().


处理此问题的正确方法是将catch()链接添加到then():


function promiseGenerator() {

  const deferred = {};


  const promise = new Promise((resolve, reject) => {

    deferred.resolve = resolve;

    deferred.reject = reject;

  });

  deferred.promise = promise;


  return deferred;

}


const generatedPromise = promiseGenerator();


//Error from the rejection is handled in the catch

generatedPromise.promise.then(res => {

  console.log("A string deferred resolved!", res);

}).catch(e => {

  console.log("This is the catch", e);

});


generatedPromise.reject("Oh no");

另一种方法是传递一个拒绝处理程序作为then()回调的第二个参数来处理 Promise 拒绝:


function promiseGenerator() {

  const deferred = {};


  const promise = new Promise((resolve, reject) => {

    deferred.resolve = resolve;

    deferred.reject = reject;

  });

  deferred.promise = promise;


  return deferred;

}


const generatedPromise = promiseGenerator();


//Error from the rejection is handled in the second callback

generatedPromise.promise.then(res => {

  console.log("A string deferred resolved!", res);

},

err => {

  console.log("This is the catch", err);

});


generatedPromise.reject("Oh no");


查看完整回答
反对 回复 2021-10-14
?
狐的传说

TA贡献1804条经验 获得超3个赞

为了捕获传递给new Promise()构造函数的回调中抛出的错误,catch块需要附加到 的返回值.then(),而不是附加到承诺本身。


generatedPromise.promise

  .then(res => {

    console.log("A string deferred resolved!", res);

  })

  .catch(e => {

    console.log("This is the catch", e);

  });

该generatedPromise.reject对象是对reject传递给构造函数的回调中的参数的引用(resolve, reject) => {}。


同样,generatedPromise.promise是对由 返回的对象的引用new Promise()。


然后,您可以捕获通过调用引发的错误的唯一方法genetratedPromise.reject()是将 a 链接.catch()到.then(). 没有其他办法。


这是查看此问题的另一种方式:


const promise = new Promise((resolve, reject) => {

  reject('test')

});



promise.catch(err => 'foo'); // throws unhandled promise rejection. Cause you rejected, but didn't catch it after the .then statement


promise.then(() => {}).catch(err => 'foo'); // doesn't throw rejection


查看完整回答
反对 回复 2021-10-14
?
翻阅古今

TA贡献1780条经验 获得超5个赞

您在承诺链中使用 catch 。 generatedPromise.promise.then(res => {

  console.log("A string deferred resolved!", res);

}).catch(error => console.log('error));


编辑:有人更快。


Edit2:看到其他帖子的评论。可能有办法,但这不是一个好习惯。


  function promiseGenerator() {

  const deferred = {};



//do your function stuff here

try{

  const promise = new Promise((resolve, reject) => {

    deferred.resolve = resolve;


 });

} catch(ex){

const promise = new Promise((resolve, reject) => {

    deferred.resolve = resolve(ex);

  });

}


  return deferred;

}

这样一来,一个 promise 就会有两种不同的结果,另一种方法是使用 if else 语句来代替 try catch 块,但这完全取决于您的应用程序。


查看完整回答
反对 回复 2021-10-14
  • 3 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信