【问题标题】:Guaranteed the final order保证最终订单
【发布时间】:2020-12-25 03:38:23
【问题描述】:

我开始使用异步和等待。 我的问题如下,我正在进行 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' },
          ]

小米功能

  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 Result

那么,我怎样才能保证控制台日志的输出是有序的呢? (0,1,2...N),我做错了什么?

非常感谢!

【问题讨论】:

    标签: javascript arrays sorting async-await


    【解决方案1】:

    getPayments 返回的结果数组已按所需顺序排列,因为您正确使用了Promise.all.map:输入数组的nth 元素将对应于nth解析数组的元素。

    由于您没有控制 何时 每个单独的 console.log 运行,它们似乎以随机顺序运行(取决于何时收到结果) - 但返回的 pay.map 回调的结束顺序仍然正确。

    如果您想让 Promise 串行运行以便记录 01 等,请执行以下操作:

    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);
    

    【讨论】:

    • 非常感谢您花时间帮助我。最后我对我的代码进行了一些编辑并得到了类似的东西......你怎么看? NewCode 所以......所有的承诺都完成了吗?所以在那之后根据每次付款获得console.log,我用结果做了另一张地图并调用了第一个输入数组的id ps:我忘记取消注释console.log行(在json解析付款下方)跨度>
    • 如果 getDataNavitaire 返回一个 Promise,这看起来很合理。
    • no :( 只是返回一个非常大的大json对象,promiseAll的每次支付都是对一个api的调用,它返回一个大约1500-3000行的json
    • 如果它没有返回一个 Promise,那么在它们的数组上调用 Promise.all 是没有意义的。仅在 Promises 数组上使用 Promise.all
    • mm 但是如果我需要在代码继续之前等待所有 api 调用完成,为什么使用承诺没有意义?我的意思是,我理解 promiseAll 等到内部的所有执行完成后再继续
    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2014-11-18
    • 2023-04-08
    • 1970-01-01
    • 2017-10-05
    • 2020-07-29
    • 2021-01-04
    相关资源
    最近更新 更多