由於我的結果有多個判斷,因此會回傳多個 reject()...
node編譯的時候就會一直出現UnhandledPromiseRejectionWarning... 需要用catch來接。
但這組被catch的reject 結果就一直沒有丟出到外面了...
有人知道為什麼嗎?? 感謝解惑!!
async function checkUpdate(updateQuery, logQuery, optionLink) {
const request_result = await getDataFromAPI(optionLink);
return new Promise(function (resolve, reject) {
if (request_result == "Request_succeed") {
let sqlRequest = new sql.Request();
sqlRequest.query(updateQuery, function (err, data) {
if (err) {
....
} else {
if (....) {
....
ProcessA = 'nodone';
resolve("New_Update");
} else if (....) {
ProcessA = 'done';
reject("No_Update");
} else if (....) {
...
ProcessA = 'nodone';
resolve("First_Update");
}
}
sqlRequest.cancel();
});
} else if (request_result == "Request_failed") {
....
ProcessA = 'done';
reject("No_Update");
}
}).catch(err => console.log(err));}
寫了一個可能測試到所有狀況的例子:(所謂可能是因為用了random,沒跑出要看到的東西的話,就多跑幾次)
test()
.then(r => {
console.log('resolve:', r);
let seed = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) % 2;
if (seed === 1) {
throw new Error('Error in Then Triggered.');
}
}, e => console.log('reject:', e))
.catch(r => console.log('catch:', r));
function test() {
return new Promise((resolve, reject) => {
let seed = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) % 3;
switch (seed) {
case 0:
resolve('Resolve Triggered.');
break;
case 1:
reject('Reject Triggered.');
break;
case 2:
throw new Error('Error Triggered.');
break;
}
});
}
簡單說,Promise除了使用then方法的resolve跟reject callback,也要用catch方法才能捕捉到所有的問題(假設問題發生在then裡面的callbacks,而之後沒有then或沒加上reject callback的話)。