我有以下内容;
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();
}
}
答案 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.");
})