ES6 Promiseのメモ
非同期処理のスマートな書き方の1つの解として注目を集めているPromise。
Deferredとか呼ばれたり、実装によってメソッド名とか仕組みとかが微妙に違ったり、しょうがないことですが言語仕様次第で実装方法が変わったりと、今ひとつ安定しないデザパタですが、コアコンセプトはES6のPromiseで抑えておくのが良いんじゃないかなと思います。
// 普通の実装 function incrementAsyncCallback(n, callback) { setTimeout(function() { callback(n+1); }, 100); } // thenメソッドを持つ(=thenable)オブジェクトを返す実装。 function incrementAsyncThenable(n) { var then; setTimeout(function() { if (then) then(n+1); }, 100); return { then: function(callback) { then = callback; } }; } // ES6 Promiseを利用した実装 function incrementAsyncPromise(n) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(n+1); }); }); } // 上述の非同期関数をPromiseで逐次的に実行する例 Promise.resolve(1) .then(function(n) { // Promiseでラップしてあげればthenで繋げられる return new Promise(function(resolve, reject) { incrementAsyncCallback(n, function(n) { resolve(n); }); }); }) .then(function(n) { // thenableなオブジェクトを返す場合はPromise.resolve return Promise.resolve(incrementAsyncThenable(n)); }) .then(incrementAsyncPromise) // Promise返すなら何もする必要ない .then(function(n) { console.log(n); // => 4 });