非同期処理
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' ]