necotech blog

Task.jsがすごい

Task.jsは、簡単に言うと、複数の非同期処理の完了を待ち、待機成功・失敗時に関数を実行することができるライブラリです。コロンブスの卵的な発想が個人的にすごく気に入っているので紹介します。ちなみに前身のflow.jsの頃からのファンです。

Task.js (github)
Task.js (スライド)

すごくシンプル

Task.jsがあれば、Promise/Deferredの100倍楽に非同期処理の待機ができます。詳しい説明はぜひ上記のスライドを見てほしいのですが、簡単な例を以下に書きました。1秒後に完了する処理、2秒後に完了する処理があり、2つめの処理が終わったタイミングでコールバックが呼ばれます。

// 引数1: タスクの個数(pass()の回数)
// 引数2: 完了後に呼ばれる関数
var task = new Task(2, function(){
  console.log("finished");
});

setTimeout(function(){console.log("task1 complete"); task.pass();}, 1000);
setTimeout(function(){console.log("task2 complete"); task.pass();}, 2000);

ちなみにこれをjQuery.Deferredで書くと以下。

var d1 = new $.Deferred;
setTimeout(function(){console.log("task1 complete"); d1.resolve();}, 1000);

var d2 = new $.Deferred;
setTimeout(function(){console.log("task2 complete"); d2.resolve();}, 2000);

$.when(d1.promise(), d2.promise())
  .done(function(){console.log("finished");});

このくらいの処理なら実質あんまり変わらないですが、まず覚える単語が多いです。Deferredの場合はdeferred, resolve(), promise(), when(), done()に対して、Task.jsの場合はtask, pass()の二つのみ!もちろん他にも便利な仕組みやメソッドがあるのですが、まずtaskとpass()さえ覚えてあとはリファレンスを見れば何とかなります。

非同期じゃなくても使える

同期/非同期が混在した場合に、一方はループで、一方はコールバックの連鎖で制御している。場当たり的だし、できれば同期/非同期を意識せずに扱いたい

サンプルコードの通り、n回pass()すれば実行する仕組みですので、非同期に限らず動作することが分かると思います。

便利な機能

を全部説明したいところですが、本家のスライドを参照すれば十分なので割愛します。特に#Task.jsを便利に使いこなすを見れば、その名の通りタスクを様々な方法で管理できることが分かると思います。


作者のuupaaさんは、他にもかなりの数のJavaScriptのコードを開発している方で、最近だとブラウザ上(JS)でバイナリを扱うライブラリなる変態的なものを公開しています。

githubのアカウント

Share on Facebook
Share on LinkedIn
Pocket