函数内部函数不等待 javascript 中的承诺
function inside function is not waiting for promise in javascript
抱歉,如果我的标题不是很明确,我不知道如何正确解释。
我正在尝试为使用环回 3 和 mongodb 的应用程序使用独特的功能。它似乎工作正常,但我的端点不会在我的函数中命中 return。
这是我的代码
const distinctUsers = await sellerCollection.distinct('userId',{
hostId : host.id,
eventId:{
"$ne" : eventId
}
}, async function (err, userIds) {;
if(!userIds || userIds.length ==0)
return [];
const filter = {
where:{
id: {
inq: userIds
}
}
};
console.log("should be last")
return await BPUser.find(filter);
});
console.log(distinctUsers);
console.log("wtf??");
//return [];
如果我取消注释 return [] 它将发送 return 稍后它会显示应该是最后一个,所以即使我没有 return 它似乎结束。现在正在等待响应。我不喜欢我的代码的样子,所以任何关于如何让它看起来更好的指示我都会接受。
看起来 sellerCollection.distinct
将回调作为其参数之一,因此,您 不能 将 async/await
与回调函数一起使用,因为这不是承诺。
如果您想使用 async/await
:
,我建议将此调用变成一个承诺
function findDistinct(hostId, eventId) {
return new Promise((resolve, reject) => {
sellerCollection.distinct(
'userId',
{ hostId, eventId: { "$ne": eventId } },
function (error, userIds) {
if (error) {
reject(error);
return;
}
if (!userIds || userIds.length === 0) {
resolve([]);
return;
}
resolve(userIds);
}
)
})
}
然后,您可以像这样将这个新函数与 async/await
一起使用:
async function getDistinctUsers() {
try {
const hostId = ...
const eventId = ...
const distinctUsers = await findDistinct(hostId, eventId)
if (distinctUsers.length === 0) {
return
}
const filter = {
where: {
id: { inq: userIds }
}
}
const bpUsers = await BPUser.find(filter) // assuming it's a promise
console.log(bpUsers)
} catch (error) {
// handle error
}
}
抱歉,如果我的标题不是很明确,我不知道如何正确解释。 我正在尝试为使用环回 3 和 mongodb 的应用程序使用独特的功能。它似乎工作正常,但我的端点不会在我的函数中命中 return。 这是我的代码
const distinctUsers = await sellerCollection.distinct('userId',{
hostId : host.id,
eventId:{
"$ne" : eventId
}
}, async function (err, userIds) {;
if(!userIds || userIds.length ==0)
return [];
const filter = {
where:{
id: {
inq: userIds
}
}
};
console.log("should be last")
return await BPUser.find(filter);
});
console.log(distinctUsers);
console.log("wtf??");
//return [];
如果我取消注释 return [] 它将发送 return 稍后它会显示应该是最后一个,所以即使我没有 return 它似乎结束。现在正在等待响应。我不喜欢我的代码的样子,所以任何关于如何让它看起来更好的指示我都会接受。
看起来 sellerCollection.distinct
将回调作为其参数之一,因此,您 不能 将 async/await
与回调函数一起使用,因为这不是承诺。
如果您想使用 async/await
:
function findDistinct(hostId, eventId) {
return new Promise((resolve, reject) => {
sellerCollection.distinct(
'userId',
{ hostId, eventId: { "$ne": eventId } },
function (error, userIds) {
if (error) {
reject(error);
return;
}
if (!userIds || userIds.length === 0) {
resolve([]);
return;
}
resolve(userIds);
}
)
})
}
然后,您可以像这样将这个新函数与 async/await
一起使用:
async function getDistinctUsers() {
try {
const hostId = ...
const eventId = ...
const distinctUsers = await findDistinct(hostId, eventId)
if (distinctUsers.length === 0) {
return
}
const filter = {
where: {
id: { inq: userIds }
}
}
const bpUsers = await BPUser.find(filter) // assuming it's a promise
console.log(bpUsers)
} catch (error) {
// handle error
}
}