Indexed Database APIを使いやすくするためのライブラリ KageDB その3 - 待ち合わせ

KageDB の紹介です。


今回は待ち合わせです。
joinというメソッドをつかって複数処理を待ち合わせします。こんな感じで使います。以下の例では削除と追加を同時にやっています。

myDB.tx(["person"], function (tx, person) {
    var requests = [
        person.delete(1), // 削除処理
        person.add({name: "MARK", age: 20}) // 追加処理
    ];
    tx.join(requests, function () {
        console.log("done: join"); // 削除と追加の両方が完了したら呼ばれる
    });
});


オリジナルAPIだとこんな感じになるはず。どうしても煩雑なコードになりますね。

var person = tx.objectStore("person");
var requests = [];
requests.push(person.delete(1)); // 削除処理
requests.push(person.add({name: "MARK", age: 20})); // 追加処理
var len = requests.length;
var pending = len;
var results = new Array(len);
for (var i = 0; i < len && pending > 0; i++) {
    (function (i) {
        var req = requests[i];
        req.onsuccess = function (event) {
            var value = event.target.result;
            results[i] = value;
            pending--;
            if (pending === 0) {
                console.log("done: join"); // 削除と追加の両方が完了したら呼ばれる
            }
        };
    }(i));
}


動くサンプルコードです。Chromeだと動きます。dump -> join -> dumpと押すと挙動がわかります。


ちなみに、joinという名前は、WinJS.Promise.joinに合わせています。


いずれは、WinJS.Promiseと組み合わせた場合の書き方なんかも紹介する予定です。