| « 非同期ループ処理 (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);