PUROGU LADESU

ポエムがメインのブログです。

【Javascript】Promise.allは順番を保証されるか

勘違いしていました。

返値は、実行完了の順とは関係なく、 Promise が渡された順に並びます。

とあるので、保証されると思います。

developer.mozilla.org

実際にやってみました。 処理はtimer1000が一番早く終了しますが、渡した順番の通りtimer3000が配列の1個目に格納されて返されます。

わざわざfor文でawaitを回さなくてもいいということです。

const timer1000 = () => {
  return new Promise((resolve, reject) => {
    console.log("start1000");
    setTimeout(() => {
      console.log("finish1000");
      resolve("done1000");
    }, 1000);
  });
};

const timer2000 = () => {
  return new Promise((resolve, reject) => {
    console.log("start2000");
    setTimeout(() => {
      console.log("finish2000");
      resolve("done2000");
    }, 2000);
  });
};

const timer3000 = () => {
  return new Promise((resolve, reject) => {
    console.log("start3000");
    setTimeout(() => {
      console.log("finish3000");
      resolve("done3000");
    }, 3000);
  });
};

func6 = async () => {
  let acc = await Promise.all([timer3000(), timer2000(), timer1000()]);
  console.log(acc); // [ 'done3000', 'done2000', 'done1000' ]
};

mapを使った例

func7 = async () => {
  let arr = [timer3000, timer2000, timer1000];
  let ans = await Promise.all(
    arr.map(async (v, i) => {
      let ret = await v();
      console.log("add");
      return ret;
    })
  );
  console.log(ans);
};