首页 > 解决方案 > 如何返回在 Javascript/Node 中填充了 ASYNC 函数的数组的值?

问题描述

我用谷歌搜索和搜索,似乎无法从我发现自己的这个湿纸袋中脱身。

我有一个导出函数,它从 web api 中获取一堆数据,然后我们对这些数据做一些事情,返回并获取更多数据,最后返回一个 javascript 对象。至少这是计划。我的一切工作正常,直到我必须将数据从模块发送回我的主 app.js 文件。

这是我希望成为我的函数的相关代码......我省略了很多,但我认为它不相关。

//SNIP

   let airportBoards = [...results];

   const updateBoards = () => {

       airportBoards.forEach(airport => {

           console.log(airport)
           boardTypes.forEach(board => {

               let currentOffset = airport[board].next_offset;

               (async function () {

                   while (currentOffset > 0) {

                       await getOffsetData(airport.airport, board, currentOffset)   //axios request
                       .then(res => {
                           currentOffset = res.data.AirportBoardsResult[board].next_offset
                           newFlights = res.data.AirportBoardsResult[board].flights
                           console.log(currentOffset)
                           let index = airportBoards.findIndex(r => r.airport === airport.airport)
                           airportBoards[index][board].flights.push(...newFlights)
                       })
                   }
               })()
           })
       })
   }

最终,我需要做的是从中获取“airportBoards”的内容。据我所知,一切都在工作,它遍历偏移量,并调用直到没有更多数据返回。而且我可以看到 airportBoards 数组正在使用调试工具正确更新......一旦所有异步/等待的东西都解决了,我就是不知道如何使用它(airportBoards)。

提前道歉......我知道它不漂亮......我只是希望我在这里提供了足够的信息让有人帮我一把。

提前致谢!

标签: javascriptnode.jsasync-await

解决方案


您可以使用Promise.all等待所有承诺解决:

let airportBoards = [...results];

const updateBoards = () => {
  let arrayOfPromises = [];
  airportBoards.forEach(airport => {
    console.log(airport)
    boardTypes.forEach(board => {
      let currentOffset = airport[board].next_offset;
      let promise = (async function() {
        while (currentOffset > 0) {
          await getOffsetData(airport.airport, board, currentOffset)
            .then(res => {
              currentOffset = res.data.AirportBoardsResult[board].next_offset
              newFlights = res.data.AirportBoardsResult[board].flights
              console.log(currentOffset)
              let index = airportBoards.findIndex(r => r.airport === airport.airport)
              airportBoards[index][board].flights.push(...newFlights)
            })
        }
      })();
      arrayOfPromises.push(promise);
    });
  })
  Promise.all(arrayOfPromises).then(() => { /* finish - do whatever you want */ });
}

推荐阅读