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

How to sort promises in their resolved order not caring about order in arguments

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

我希望我的函数能够 return promises 以便它们像这样开始:["R3", "R1", "R2"]

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

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

您可以在 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;
}