在 Javascript 中使用 Promise.all 在 flatMap 中编写条件语句的正确方法是什么

问题描述 投票:0回答:1

我正在与

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 语句执行?

javascript promise flatmap promise.all
1个回答
0
投票

您的

flatMap
回调没有
return
语句,因此这些
async
调用返回的承诺将解析为
undefined

当您想要获取

updateMany()
承诺解析的值时,您应该返回这些值。

至少有两种方法可以做到这一点:

  1. 获取

    await Events.updateMany()
    求值的值,然后返回它(您当然会添加参数):

    const success = await Events.updateMany();
    return success;
    
  2. 返回

    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...
}
© www.soinside.com 2019 - 2024. All rights reserved.