节点 axios 调用不等待承诺

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

当我通过 axios 进行网络调用时,消费服务不会等待它

执行功能:

accountResolved: (atNumber, bkCode) => {
    return new Promise((resolve, reject) => {
      axios.get(`url/foo/bar`, {
        headers: {
          'Authorization': 'token',
        }
      })
      .then(
          (response) => {
            resolve(response.status === 200 ? true : false);
          },
          (error) => {
            console.log(error);
            resolve(false);
          })
        .catch((error) => {
          console.log(error);
          reject(error);
        });
    });
  },

消费功能

mapResolvedBankCode: (readCsvFileResponse, etransactBankCodes) => {
    return new Promise((resolve, reject) => {
      const readCsvFileResponseClone = [...readCsvFileResponse];
      readCsvFileResponseClone.forEach((item) => {

        for (let index = 0; index < etransactBankCodes.length; index++) {
          const bankCode = etransactBankCodes[index];

          CsvService.accountResolved(item.accountNumber, bankCode)
            .then(
              (result) => {
                if (result) {
                  console.log(`resolved account ${item.accountNumber}, with bank ${bankCode}`);
                  item.bankCode = bankCode;
                }
              },
            (error) => {
              console.error('mapResolvedBankCode', error);
              item.bankCode = 'err';
            })
            .catch((err) => {
              console.error(`error in account no. ${item.accountNumber}::: `, err);
              item.bankCode = 'err';
            });
        }

      });
      if (readCsvFileResponseClone && readCsvFileResponseClone.length > 0) {
        resolve(readCsvFileResponseClone);
      } else {
        reject('readCsvFileResponseClone not formed correctly');
      }
    });
  },

我预计消费函数将等待执行函数,但它没有发生。在 axios 网络调用开始之前,消费函数已经返回响应

node.js axios promise sails.js
1个回答
0
投票

我的看法是,

readCsvFileResponseClone.forEach()
是第一个循环,其中有第二个循环
for (let index = 0; index < etransactBankCodes.length; index++) {}
,在这个循环中是调用执行函数的地方。

forEach()
不是 async fn,并且根据 MDN 文档,无法停止 forEach()。根据文档,您需要使用
for
for...of
for...in
甚至数组方法,如
every()
some()
find()
findIndex()

所以我建议您尝试在

for()
数组上使用
readCsvFileResponseClone
循环,这样做第一个循环应该等待第二个循环内的逻辑,其中在退出第一个循环之前您有执行函数。

© www.soinside.com 2019 - 2024. All rights reserved.