猿问

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

我正在为 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


潇湘沐
浏览 163回答 3
3回答

一只甜甜圈

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 catchgeneratedPromise.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 callbackgeneratedPromise.promise.then(res => {  console.log("A string deferred resolved!", res);},err => {  console.log("This is the catch", err);});generatedPromise.reject("Oh no");

狐的传说

为了捕获传递给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 statementpromise.then(() => {}).catch(err => 'foo'); // doesn't throw rejection

翻阅古今

您在承诺链中使用 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 heretry{  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 块,但这完全取决于您的应用程序。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答