当我通过 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 网络调用开始之前,消费函数已经返回响应
我的看法是,
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
循环,这样做第一个循环应该等待第二个循环内的逻辑,其中在退出第一个循环之前您有执行函数。