iT邦幫忙

0

Promise 只能 return 一組 resolve和reject 是嗎?

由於我的結果有多個判斷,因此會回傳多個 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));}
看更多先前的討論...收起先前的討論...
dragonH iT邦超人 5 級 ‧ 2020-02-02 14:17:49 檢舉
沒有 code 只有神能幫你了
fillano iT邦超人 1 級 ‧ 2020-02-02 16:18:13 檢舉
你說的catch是?
Rach iT邦新手 4 級 ‧ 2020-02-03 05:41:08 檢舉
如果有程式碼的話我們能夠幫你
覆蓋一張「神」,結束這一回合。
shinder iT邦新手 5 級 ‧ 2020-02-03 09:51:04 檢舉
可以在 catch() 的 callback function 內使用 throw new Error()
https://github.com/shinder/js-vid-class/blob/master/promise/promise-03.html
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));
}

1 個回答

4
fillano
iT邦超人 1 級 ‧ 2020-02-03 09:47:11

寫了一個可能測試到所有狀況的例子:(所謂可能是因為用了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的話)。

/images/emoticon/emoticon41.gif

感謝!! 我來試試看~~

【神】真的出現了...(是【佛】吧)

我要發表回答

立即登入回答