javascript - 使用不拒绝的承诺是不好的做法吗?
问题描述
我有以下内容;
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();
}
}
解决方案
好吧,你可以使用 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.");
})