非同期処理

Promise

最近のNode.jsはjavascriptにあったPromise APIが使用できるようになりました。

今回はPromiseを使用して非同期処理を記述していきましょう。

まず、Promiseについておさらいしてみましょう。

本来非同期のメソッドをつなげていくと大量のコールバックが発生してしまします。(通称:コールバック地獄)

func1(function(a){
  func2(a, function(b){
    func3(b, function(c){
      done(func3); 
    });
  });
});

ここで登場するのはPromiseによるメソッドチェーンです。

func1().then(func2).then(func3).then(done);

このように可読性を失わなわずに非同期処理を書く事ができます。

それではNode.jsでPromiseを使用してみましょう。

以下のよう使用します。

console.log('Start!');
function promiseTest(str) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(str);
    }, 1000);
  });
}

promiseTest('Async').then(function(result) {
  console.log(result);
});

console.log('Sync');

実行するとこのように出力されます。

Start!
Sync
Async

コードの解説をします。

文字列が引数の関数を作りその中でPromiseのインスタンスを作成します。

function promiseTest(str) {
  return new Promise(function(resolve, reject) {

その中で1秒待ってPromiseオブジェクトを返す処理を記述します。

setTimeout(function() {
 resolve(str);
}, 1000)

これでPromiseを使用したメソッドの完成です。

次に非同期メソッドを使用します。

thenメソッドを用いることで呼び出した関数の戻り値を受け取れます。

promiseTest('Async').then(function(result) {
  console.log(result);
});

このようにしてPromiseを使用することできます。

並列処理

Promise.allを使用するとは配列で渡されたPromiseが全ての成功(または最初の失敗)を待つ事ができます。

以下のように使用します。

console.log('Start!');
function promiseTest(promiseArr) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(promiseArr);
    }, 1000);
  });
}

var tasks = [
  promiseTest('Async1'),
  promiseTest('Async2'),
  promiseTest('Async3')
];
Promise.all(tasks).then(function(results) {
  console.log(results);
});

console.log('Sync');

実行するとこのように出力されます。

Start!
Sync
[ 'Async1', 'Async2', 'Async3' ]

results matching ""

    No results matching ""