簡體   English   中英

node.js承諾不返回任何內容

[英]node.js promise returns nothing

我有一個函數,如果在“模式”行中有“ 1”的用戶,則返回true。 如果行“模式”中的“ 1”不存在,我想做些事情。

function check_mod(user_id) {
    return new Promise(function(resolve, reject) {
        db.each(`SELECT mode FROM users WHERE id = ` + user_id + ` AND mode = 1 LIMIT 1`, [], (err, row) => {
            if(err) reject(false);
            if (row.mode == 1) {
                resolve('true');
            }
        });
    });
}

check_mod('286927644405137407').then((user) => {
     console.log(user);
     console.log('ok');
}).catch((error) => {
     console.log('nie okej');
});

此代碼返回“確定”,但是如果我將“ 286927644405137407”更改為其他內容,則不會返回“ nie okej”。

您在db.each回調中有一條路徑,該路徑不會調用reject resolve ,因此您永遠不會在該路徑上實現諾言。 你需要改變

if (row.mode == 1) {
    resolve('true');
}

if (row.mode == 1) {
    resolve('true');
} else {
    reject(/*...typically you'd use new Error() here...*/);
}

例如,使用setTimeout代替db.each

 function check_mod(user_id) { return new Promise(function(resolve, reject) { setTimeout(() => { // Fake `err` and `row` const err = null; const row = { mode: user_id === '286927644405137407' ? 1 : 0 }; // End fake if(err) reject(false); if (row.mode == 1) { resolve('true'); } else { reject(new Error("invalid user")); } }, 100); }); } check_mod('286927644405137407').then((user) => { console.log("first test", user); console.log("first test", 'ok'); }).catch((error) => { console.log("first test", 'nie okej'); }); check_mod('other').then((user) => { console.log("second test", user); console.log("second test", 'ok'); }).catch((error) => { console.log("second test", 'nie okej'); }); 

但是可能還有另一個問題: db.each名稱和您在db.each回調上使用的參數名稱row表明該回調將被調用多次(例如,“針對每一行”)。 一個promise只能被解決一次,不能重復被解決,因此,如果多次調用該回調,則只有第一個對promise會產生影響。 您的SQL查詢具有LIMIT 1因此我認為在這種情況下不會發生,但是...

克里斯·李的評論是正確的。 您的代碼只需要處理row.mode不等於1的情況。

db.each(`SELECT mode FROM users WHERE id = ` + user_id + ` AND mode = 1 LIMIT 1`, [], (err, row) => {
            if(err) reject(false);
            if (row.mode == 1) {
                resolve('true');
            } else {
              //resolve or reject here
            }
        });

給您的建議:如果未找到user_id(我在查詢中看到包含include AND mode = 1

        db.each(`SELECT mode FROM users WHERE id = ` + user_id + ` AND mode = 1 LIMIT 1`, [], (err, row) => {
            if(err || !row) return reject(false);
            if (row.mode == 1) {
                resolve('true');
            }
        });

就像@TJ Crowder的回答和他的評論一樣,原因可能是您的查詢需要很長時間才能返回結果,因此可以減少連接調試時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM