使用承诺而不拒绝的做法是不好的做法吗?

时间:2019-11-30 22:56:25

标签: javascript node.js

我有以下内容;

function isUserInDatabase(serverID, playerID) {
    return new Promise((resolve, reject) => {
            executeQuery("SELECT * FROM playerdata where serverID=" + serverID + " AND playerID=" + playerID).then((res) => {
                if (res[0] === undefined) {
                    resolve(false);
                } else {
                    resolve(true);
                }
            });
    }).catch ((e) => {
        console.error(e);
        console.log("Error retrieving data from database.");
    });
}

但是我没有拒绝电话。这是不好的约定吗?

编辑:老实说,我不确定这是否更好。我已经读了一些关于诺言的文章,也许这会更好一些,但是我不确定。

async function handlePlayer(serverID, playerID) { //TEST
    console.log(await isUserInDatabase(serverID, playerID));
}

function isUserInDatabase(serverID, playerID) {
    return executeQuery("SELECT * FROM playerdata where serverID=? AND playerID=?", [serverID, playerID]).then((res) => {
        if (res[0] === undefined) {
            return false;
        } 
        return true;
    })
    .catch ((err) => {
        console.log(err);
    });
}

async function executeQuery(query, opts) {
    let conn;
    try {
        conn = await pool.getConnection();
        return await conn.query(query, opts);
    } catch (err) {
        console.log(err);
    } finally {
        conn.end();
    }
}

1 个答案:

答案 0 :(得分:2)

好吧,您可以使用承诺而不会拒绝。但是,您必须确保在所有函数流中都调用resolve来触发“ then”处理程序(或者函数必须以错误或异常结尾才能触发catch子句)。 拒绝通常用于触发链接到变量值和结果的错误处理逻辑。如果您的代码失败的唯一方法是由于异常,那么拒绝是没有必要的(尽管这是我的观点)

正如@Jared Smith指出的那样,您应该以这种方式做事,诺言实际上可以拒绝:

function isUserInDatabase(serverID, playerID) {
    const query = "SELECT * FROM playerdata where serverID=" + serverID + " AND playerID=" + playerID;
    return executeQuery(query).then(res => {
        const isUndefined = res[0] === undefined
        return !isUndefined
    }).catch (e => {
        console.error(e);
        console.log("Error retrieving data from database.");
    });
}

尽管您将无法处理此承诺错误(已经有一个catch子句)

您可以在调用isUserInDatabase之后忽略上述catch子句并处理错误:

function isUserInDatabase(serverID, playerID) {
    const query = "SELECT * FROM playerdata where serverID=" + serverID + " AND playerID=" + playerID;
    return executeQuery(query).then(res => {
        const isUndefined = res[0] === undefined
        return !isUndefined;
    });
}

...

isUserInDatabase("some_server","some_player")
.then( ok => console.log("User is in database!") )
.catch( e => {                
    console.error(e);
    console.log("Error retrieving data from database.");
})
相关问题