我正在与
flatMap
一起开发 Promise.all
; flatMap
里面有两个条件,originalObj
用于检查originalObj.state
是否为假,然后执行insertRealStartTime
,并且在每个event
中,无论条件如何,我都会执行Event.updateMany
,我也想返回它,因为Events.updateMany()
的返回告诉我更新是否成功。
function async foo(){
const eventPromises = events.flatMap(async (event) => {
if (event.state.matchPhase == "1H") {
// simpleQuery is async function
const originalObj = await simpleQuery({ id: event.id });
if (originalObj.state == false) {
// insertRealStartTime is async function
await insertRealStartTime(event.id);
}
}
// Event.updateMany is async function
await Events.updateMany(
{ ...event, expireAt: event["startTime"] },
);
}
);
const all = await Promise.all(eventPromises);
console.log(all)
}
我在
undefined
中得到了console.log(all)
的数组;我想我可能不应该在await
里面使用flatMap
,因为它失去了使用Promise.all
的意义;但是,我应该如何处理所有这些 if 语句以确保异步函数将基于带有 Promise.all
的 if 语句执行?
您的
flatMap
回调没有 return
语句,因此这些 async
调用返回的承诺将解析为 undefined
。
当您想要获取
updateMany()
承诺解析的值时,您应该返回这些值。
至少有两种方法可以做到这一点:
获取
await Events.updateMany()
求值的值,然后返回它(您当然会添加参数):
const success = await Events.updateMany();
return success;
返回
Events.updateMany()
返回的promise:
return Events.updateMany();
两者都有效。
不是问题,但如果回调返回一个承诺(正如您的情况),则没有理由使用
flatMap
。如果您期望 arrays作为回调的返回值,
flatMap
会很有用,但对于 async
回调来说这是不可能的——它们总是返回 Promise 对象。所以你可以只使用map
。
对代码进行一些其他更新后,您会得到以下结果:
function async foo() {
const eventPromises = events.map(async (event) => {
if (event.state.matchPhase == "1H") {
// You can use destructuring here, as you're only interested in the state property
const {state} = await simpleQuery({ id: event.id });
if (!state) { // Use NOT operator
await insertRealStartTime(event.id);
}
}
// Return the promise
return Events.updateMany(
{ ...event, expireAt: event.startTime }
);
}
);
const all = await Promise.all(eventPromises);
console.log(all);
return all; // Provide the caller something to work with...
}