忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

JavaScript Promise および async / await の使い方(非同期処理を同期処理にする)

Promise の使い方して以下の記事を書きましたが、今回は Promise を返す関数を同期的に処理するための async / await の使い方の記事を書いてみます。

JavaScript Promiseの使い方(非同期処理に関連して)
JavaScript Promiseの使い方2(非同期処理に関連して)

あらためて、Promise を使用した関数ですが、以下のものを使用します。

■Promise を使用した関数例

// Promise を返す関数の宣言
function test_callback(timeoutval) {
    return new Promise(function(resolve) {
        setTimeout(function() {
            resolve(timeoutval);
        }, timeoutval);
    });
}

この関数は setTimeout を使ってタイムアウトした時に resolve で指定された関数を実行します。
それではこの関数を使用してみます。

// テスト
test_callback(1000).then((data) => {
    console.log('callback...OK:' + data);
});
// test_callback()をCALLした直後にコンソール出力
console.log('test_callback:実行');


これを実行すると以下のものがコンソール出力されます。

test_callback:実行		// 先にこのメッセージが表示
callback...OK:1000

2行目のメッセージは test_callback 内のタイムアウトが終わってからの表示となります。 これを逆順で表示させたい場合(ソース上の順番通り)には async / await を使うことになります。

■async / await を使って同期処理を行う

公式サイトには async / await の説明が以下の様にあります。

async function 宣言は非同期関数を宣言し、その中で await キーワードを使うことができます。
async および await キーワードを使用することで、プロミスベースの非同期の動作を、
プロミスチェーンを明示的に構成する必要なく、よりすっきりとした方法で書くことができます。

この説明によれば、非同期関数の宣言には「function」宣言の前に「async」を付けて関数宣言を行い、 Promise ベースの非同期の動作の前に「await」を付けることで、Promise ベースの非同期の動作を待つことができるようです。

上記の実行部分を1個の関数として以下の様に async / await を使って宣言します。

async function sample_callback() {
	// テスト
    await test_callback(1000).then((data) => {
        console.log('callback...OK:' + data);
    });
	// test_callback()をCALLした直後にコンソール出力
    console.log('test_callback:実行');
}

この関数を実行すると、結果としてコンソールには以下の出力が行われます。

callback...OK:1000
test_callback:実行		// 後からこのメッセージが表示

await で宣言した部分の実行が終わってから、最後のコンソール出力が実行されました。

ここで await の処理を複数行う様にしてみます。

async function sample_callback() {
	// テスト1
    await test_callback(1000).then((data) => {
        console.log('callback...OK:' + data);
    });
	// テスト2
    await test_callback(2000).then((data) => {
        console.log('callback...OK:' + data);
    });
	// テスト3
    await test_callback(3000).then((data) => {
        console.log('callback...OK:' + data);
    });
	// 最後のコンソール出力
    console.log('最後のコンソール出力');
}

これを実行すると、以下のコンソール出力が実行されました。

callback...OK:1000
callback...OK:2000
callback...OK:3000
最後のコンソール出力


同期的に順次処理が行われていることが分かります。
今回の例では実際の処理として setTimeout を使ったタイマ待ちで、タイムアウト時の処理を行わせていますが、 実用的な処理においても、いろんな機能のメソッドの処理終了時にコールバック関数を呼ぶものがります。
この場合にも Promise で処理関数を宣言し、それを呼出す関数を async / await で行えば、 同期的に処理が行われるので、ソース的には上から下への流れに記述できると思います。

関連する記事

JavaScript 何に使う
JavaScript jQueryの使い方(セレクタ)
JavaScript jQueryの使い方(セレクタ)その2
JavaScript 関数の宣言について(function)
JavaScript jQueryでJavascriptファイルの動的に変更する方法
JavaScript jQueryを使った checkbox の操作方法












PR

コメント

コメントを書く