[英]Guaranteed the final order
我开始使用异步和等待。 我的问题如下,我正在进行 api 调用 X 次,我需要最终结果保持在循环遍历该数组的顺序中,但由于我的控制台,我不确定我是否做对了。日志它没有像我认为的那样显示
数据
Data = [
{ paymentId: '784', pnr: 'Z8PQ3T', email: 'test@gmail.com' },
{ paymentId: '211', pnr: 'Z8PQ3T', email: 'test@gmail.com' },
{ paymentId: '325', pnr: 'L4MEQC', email: 'test@gmail.com' },
{ paymentId: '454', pnr: 'A357HS', email: 'abc@d.com' },
{ paymentId: '674', pnr: 'QCYCGX', email: 'abc@d.com' },
{ paymentId: '723', pnr: 'W41BTV', email: 'test@gmail.com' },
{ paymentId: '812', pnr: 'HE4JUR', email: 'test@gmail.com' },
]
小米function
const getPayments = async payments => {
return Promise.all(payments.map(async (payment, i) => {
let { pnr, email, paymentId } = payment
let pay = JSON.parse(await getDataNavitaire(pnr, email))
console.log(`Pay numero ${i}`, pay);
pay = validationPaymentsNUEVO(pay, paymentId)
if (pay) {
pay.paymentIdEntrante = paymentId
pay.isReprocessPayment = isReprocess
}
return pay
}))
控制台日志的结果是 2, 0, 1, 4, 3结果
那么,我如何保证控制台日志的 output 是有序的? (0,1,2...N),我做错了什么?
非常感谢!
getPayments
返回的结果数组已按所需顺序排列,因为您正在使用Promise.all
和.map
正确:输入数组的第n
个元素将对应于解析数组的第n
个元素。
由于您无法控制每个单独的console.log
何时运行,因此它们似乎以随机顺序运行(取决于收到结果的时间) - 但在.map
回调结束时返回的pay
仍将在正确的顺序。
如果您想让 Promises 串行运行以便记录0
、然后1
等,请执行以下操作:
const getPayments = async payments => {
const pays = [];
for (let i = 0; i < payments.length; i++) {
const { pnr, email, paymentId } = payments[i];
let pay = JSON.parse(await getDataNavitaire(pnr, email))
console.log(`Pay numero ${i}`, pay);
// ...
pays.push(pay);
}
return pays;
};
但是您当前的Promise.all
版本更快更合适。 我会使用它,并在getPayments
完成后记录数组,例如:
const result = await getPayments(payments);
console.log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.