代码之家  ›  专栏  ›  技术社区  ›  fewfew

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

  •  0
  • fewfew  · 技术社区  · 4 年前
    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);
    });
    

    我希望我的函数返回promise的顺序如下:[“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()将保留该顺序)

    0 回复  |  直到 4 年前
        1
  •  2
  •   Bergi    4 年前

    你可能正在寻找

    async function fulfillmentOrder(promises) {
        const results = [];
        await Promise.all(promises.map(promise =>
            promise.then(value => {
                results.push(value);
            })
        ));
        return results;
    }
    
        2
  •  1
  •   Jonas Wilms    4 年前

    您可以在Promises解析后将其映射到索引,然后使用 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)
          );
        }
      });
    }
    
    推荐文章