« 非同期ループ処理 (5) - 進捗表示2 | 非同期ループ処理 (7) - 同期非同期複合型 » |
非同期ループ処理 (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);