繁体   English   中英

保证最终订单

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM