3 回答
![?](http://img1.sycdn.imooc.com/56fb3e3d0001a10301000100-100-100.jpg)
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");
![?](http://img1.sycdn.imooc.com/545863cd0001b72a02200220-100-100.jpg)
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
![?](http://img1.sycdn.imooc.com/545868b60001587202200220-100-100.jpg)
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 块,但这完全取决于您的应用程序。
添加回答
举报