如何按已解决的顺序对承诺进行排序而不关心参数中的顺序

let P1 = new Promise((res,rej) => {
    setTimeout(res("R1"),2000);
});
let P2 = new Promise((res,rej) => {
    setTimeout(res("R2"),5000);
});
let P3 = new Promise((res,rej) => {
    setTimeout(res("R3"),1000);
});

我希望我的函数按照它们开始的顺序返回承诺:["R3","R1","R2"]

function preserveOrder([P1,P2,P3]); // should return ["R3,"R2"]
function preserveOrder([P2,P3,P1]); // should return ["R3,"R2"]

我想不出最好的方法是什么? (因为 Promise.all() 会保留顺序)

violawu 回答:如何按已解决的顺序对承诺进行排序而不关心参数中的顺序

您可以在 Promise 解析后将其映射到索引,然后对它们使用 Promise.all 并随后按 id 对它们进行排序:

let order = 0;

const result = await Promise.all(
  [P1,P2,P3].map(it => it.then(result => ({ result,position: order++ })))
);

result.sort((a,b) => a.position- b.position);

或者,人们可以重新发明 Promise.all 虽然这是我通常会避免的事情......

function PromiseAllOrdered(promises) {
  return new Promise((resolve,reject) => { 
    const values = [];
  
    for(const promise of promises) {
      promise.then(
        value => {
          values.push(value);
          if(promises.length === values.length) resolve(values);
        },error => reject(error)
      );
    }
  });
}
,

您可能正在寻找

async function fulfillmentOrder(promises) {
    const results = [];
    await Promise.all(promises.map(promise =>
        promise.then(value => {
            results.push(value);
        })
    ));
    return results;
}
本文链接:https://www.f2er.com/16194.html

大家都在问