我有一个函数,如果在“模式”行中有一个用户带有“ 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');
});
此代码返回“ ok”,但如果我将“ 286927644405137407”更改为其他内容,则不会返回“ nie okej”。
答案 0 :(得分:0)
您在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
回调中使用的名称row
和参数名称db.each
建议该回调将被多次调用(例如,“对于每一行”)。一个promise只能被解决一次,不能重复被解决,因此,如果多次调用该回调,则只有第一个对promise会产生影响。您的SQL查询包含LIMIT 1
,因此我认为在这种情况情况下不会发生,但是...
答案 1 :(得分:0)
克里斯·李的评论是正确的。您的代码只需要处理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
}
});