3 回答

TA貢獻(xiàn)1836條經(jīng)驗 獲得超5個贊
Promise 拒絕不會在.then()回調(diào)中處理,當(dāng)您then()首先附加回調(diào)并且承諾被拒絕時,錯誤被認(rèn)為是未處理的,因為沒有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()回調(diào)的第二個參數(shù)來處理 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");

TA貢獻(xiàn)1804條經(jīng)驗 獲得超3個贊
為了捕獲傳遞給new Promise()構(gòu)造函數(shù)的回調(diào)中拋出的錯誤,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傳遞給構(gòu)造函數(shù)的回調(diào)中的參數(shù)的引用(resolve, reject) => {}。
同樣,generatedPromise.promise是對由 返回的對象的引用new Promise()。
然后,您可以捕獲通過調(diào)用引發(fā)的錯誤的唯一方法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

TA貢獻(xiàn)1780條經(jīng)驗 獲得超5個贊
您在承諾鏈中使用 catch 。 generatedPromise.promise.then(res => {
console.log("A string deferred resolved!", res);
}).catch(error => console.log('error));
編輯:有人更快。
Edit2:看到其他帖子的評論??赡苡修k法,但這不是一個好習(xí)慣。
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 就會有兩種不同的結(jié)果,另一種方法是使用 if else 語句來代替 try catch 塊,但這完全取決于您的應(yīng)用程序。
添加回答
舉報