JavaScriptのPromise.all()の結果は、終わった順に並ぶ?

こんにちは、さるまりんです。

二つの処理を Promise.all() で待っているとき、あとから渡した方が先に終わったら、結果の配列はどう並ぶのでしょうか。

両方が成功すると、結果は Promise.all() に渡した順番 で並びます。

試してみましょう。

function finishAfter(label, ms) {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(label + "が完了");
            resolve(label);
        }, ms);
    });
}

Promise.all([
    finishAfter("A", 100),
    finishAfter("B", 10),
]).then(([a, b]) => {
    console.log("結果: " + a + ", " + b);
});

実行すると、こう表示されます。

Bが完了
Aが完了
結果: A, B

先に終わったのは B ですが、結果の先頭は A です。A を一つ目に渡したので、A の結果が一つ目に入るんですね。

例えば、ユーザー情報と注文履歴をこの順に渡したら、結果の一つ目はユーザー情報、二つ目は注文履歴です。どちらが先に届いても、同じ書き方で受け取れるので便利ですね。

なお、どれか一つでも失敗すると、この例の then() に結果は渡りません。

実際に複数のAPIを呼ぶ例は、JavaScriptでAPIを呼び出して結果をまとめて処理する方法もどうぞ。

読んでくださってありがとうございます。
それではまた!