JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】2つの非同期関数の完了後に関数を実行する方法

2つの非同期関数を要素として持つ配列を想定してみましょう。そして、両方の非同期関数の実行が完了したタイミングで、何らかの処理(ここでは例としてコンソールへの出力)を実行したいとします。

この課題には、どのようにアプローチすればよいのでしょうか?

非同期処理の完了後にタスクを実行する方法は、基本的に次の2つがあります。

  • Promise を使う方法
  • async/await 関数を使う方法

しかし、複数(2つ以上)の非同期関数を扱うコードでは、前者の Promise.all() メソッドの方が後者よりも有利です。Promise.all() は、渡されたすべての Promise が解決(resolve)されるのを待ち、その結果を配列としてまとめて返してくれるためです。

コード例

以下が実際のコードです。

const arr = [
    new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('func1 fired!');
        }, 2000);
    }),
    new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('func2 fired');
        }, 3000);
    })
];
const lastFunction = () => {
    console.log('this function should be fired at the very last');
};
Promise.all([arr[0], arr[1]]).then((resp) => {
    console.log(resp);
    lastFunction();
}).catch((err) => {
    console.log('something unexpected happened');
})

仕組みの解説

上記のコードでは、まず2つの Promise を含む配列 arr を定義しています。1つ目の Promise は2秒後に、2つ目の Promise は3秒後にそれぞれ解決されるように設定されています。

Promise.all() にこれら2つの Promise を渡すことで、両方が完了するまで待機し、then() ブロック内で両方の結果を配列として受け取った後、lastFunction() が呼び出されます。

また、いずれかの Promise が拒否(reject)された場合には catch() ブロックが実行されるため、エラーハンドリングも簡単に行えます。

実行結果

このコードをコンソールで実行すると、以下のような出力が得られます。

[ 'func1 fired!', 'func2 fired' ]
this function should be fired at the very last

このように、Promise.all() を使えば、複数の非同期処理がすべて完了したことを保証しながら、その後に続く処理を確実に実行できます。3つ以上の非同期関数を扱う場合も、同じ要領で配列に追加するだけで対応可能です。

  1. JavaScriptのコールバック関数とは?基本の仕組みと実装例をわかりやすく解説

    JavaScriptでは、関数もオブジェクトとして扱われます。そのため、関数を別の関数に引数として渡すことが可能です。このように渡された関数は、受け取った側の関数の中で呼び出すことができ、これをコールバック関数(callback function)と呼びます。 コールバックは、非同期処理やイベントハンドリングなど、現代のJavaScript開発において欠かせない重要な概念です。ここでは、基本的なコールバックの仕組みをサンプルコードとともに解説します。 コールバック関数のサンプルコード 以下は、2つの数値を加算し、その結果をコールバック関数で処理するシンプルな例です。 <!DOCTYPE

  2. 【JavaScript】onclickイベントで2つ以上の関数を実行する方法

    JavaScriptでonclickイベントを使ってボタンをクリックした際に、2つ以上の関数を同時に実行したいケースはよくあります。最もシンプルな方法は、呼び出し用の関数(ラッパー関数)を1つ作成し、その中で実行したい複数の関数を順番に呼び出すことです。 手順1:ボタンを設置する まず、HTMLにボタンを配置します。このボタンのonclick属性には、複数の関数を呼び出すための関数を指定します。 <button type=submit onclick=callTwoOtherFunctions()> 呼び出す </button> 手順2:ラッパー関数を作成する 上記のボ