我相信这是现代 JavaScript 中最基本/初学者的问题之一。目前有很多类似的问题,我已经解决了其中的大部分问题。但由于我找不到准确的答案,我在一个新问题中发布了我的问题。
我在节点和快递应用中使用 sequelize
。现在,所有像 findOne
这样的查询函数本质上都是 async
。我有两个功能,
function A(){
B()
.then((result:any) => {
if(result){
// Do something
}
});
}
async function B(){
sequelizeModel.findOne({where: {<col>:<val>}})
.then((result:any) => {
if(result === null){
return true;
}
else{
return false;
}
})
.catch((error: any) => {
console.error(error);
return false;
});
}
B()
检查数据库以查看特定数据行是否存在。因此,它将返回 true
/false
。基于该 A()
执行某些活动。
现在,B()
总是得到 result = undefined
。
一种解决方案是,
function A(){
B()
.then((result:any) => {
if(result === null){
// Do something
}
})
.catch((error:any) => {
console.error(error);
});
}
async function B(){
return await sequelizeModel.findOne({where: {<col>:<val>}});
}
但是有什么方法可以让我不想将空检查逻辑放在 A()
中并在 B()
中执行它。 (可能我缺少一些重要的理解)
答案 0 :(得分:3)
函数 B() 必须返回您尝试在函数 A() 中捕获的承诺,因此,只需从 B() 函数返回它即可。
问题是,当你把 B().then()... Javascript 期望 B() 函数返回一个承诺,实际上 B() 函数作为一个异步函数返回一个承诺,但它没有任何 return 语句,因此它解析为 undefined。
function A(){
B() // Handling the promise returned by B()
.then((result:any) => {
if(result){
// Do something
}
});
}
function B(){
return sequelizeModel.findOne({where: {<col>:<val>}}) //Returns the promise that A() function will handle.
.then((result:any) => {
if(result === null){
return true;
}
else{
return false;
}
})
.catch((error: any) => {
console.error(error);
return false;
});
}
在这种情况下,异步词不是必需的,因为它正在返回承诺。