非同期ループ処理 (6) - 列挙型

配列でなく列挙型でも同じようなことができる。
下記の例ではブックマークのデータソースから全リソースを取り出し、リソースに対してなんらかの処理を行う。

var asyncEnumProcessor = {

    _enumerator : null,

    start : function(aEnumerator)
    {
        // 開始処理
        dump("start
");
        // 初期化
        this._enumerator = aEnumerator;
        this._next();
    },

    _next : function()
    {
        if ( this._enumerator.hasMoreElements() ) {
            var elt = this._enumerator.getNext();
            setTimeout(function(){ asyncEnumProcessor._process(elt); }, 0);
        } else {
            setTimeout(function(){ asyncEnumProcessor._finish(); }, 0);
        }
    },

    _process : function(aElt)
    {
        aElt.QueryInterface(Components.interfaces.nsIRDFResource);
        // 処理
        dump("processing... " + aElt.Value + "
");
        // 次の処理へ
        this._next();
    },

    _finish : function()
    {
        // 終了処理
        dump("finish
");
    },

};

var RDF_SVC = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService(Components.interfaces.nsIRDFService);
var dataSource = RDF_SVC.GetDataSource("rdf:bookmarks");
var resourceEnum = dataSource.GetAllResources();
asyncEnumProcessor.start(resourceEnum);

TOP

TOP