首页 > 解决方案 > 使用不拒绝的承诺是不好的做法吗?

问题描述

我有以下内容;

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.");
    });
}

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

编辑:老实说,我不确定这是否更好。我对 Promise 做了更多的阅读,也许这会好一些,但我不确定。

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();
    }
}

标签: javascriptnode.js

解决方案


好吧,你可以使用 Promise 而不会拒绝。但是,您必须确保在所有函数流中调用 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.");
})

推荐阅读