[英]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.