node.js承诺不返回任何内容

时间:2018-09-11 17:45:08

标签: javascript node.js promise

我有一个函数,如果在“模式”行中有一个用户带有“ 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”。

2 个答案:

答案 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
            }
        });