June 19, 2010

JavaScript:単純な wait() はやっぱり実装不可能っぽい


1) ループウェイト … ループ回数が増えると、ブラウザのレンダリング処理ができなくなるケースもあり、ブラウザがフリーズする。

2) 再帰を用いる … too much recursion なエラー。当然か。

でもね。console.log( costtime) を入れて動かしてみると
 firefox + firebug な環境で意図した処理になるっぽいw
console.log( costtime) を外した途端にエラー。
エラー内容(あまりにも多い再帰)には納得したけど。

	function Wait( msec, starttime )
{
var func = arguments.callee;
var now = (new Date()).getTime();
msec = msec||20;
starttime = starttime||now;
var costtime = now - time;
console.log( costtime )
return ( costtime > msec )
? "timeup " + costtime
: func( msec, starttime );
}

console.log("wait " + (new Date()).getTime() );
var rslt = Wait( 200 );
alert("wait " + rslt );

よくある監視用の関数を使うのがベターかなと。



なぜ今更 sleep, wait ネタかって?

非同期処理の結果を返したい関数があった。

var getItems = function ()
{
// sql 実行結果を取得。
var db = window.openDatabase( /* 略 */ )
var sqlResult;

db.transaction(
// Open transaction & execut SQLs.
function(tx)
{
tx.executeSql(
"SELECT count(*) FROM table",
[], // placeholder
function(tx, rslt)
{
sqlResult = rslt.rows;
}
);
},
// Error & close transaction.
function(err)
{
console.log(err.message);
},
// Completed & close transaction.
function()
{
}
)

// (JavaScriptのClient Databaseは非同期なので、sleep が必要)

return sqlResult;// sql の結果を返す

}









HTML5 の Web SQL Database : Synchronous database API が実装されるまでは、JavaScriptによる大規模なクライアントアプリケーション実装は難しいかも。

ちなみに、openDatabaseSync() は、WebWorkerオブジェクトを記述するソースコード(myWorker.js) 内 でなければ利用できないらしいので、
別スレッドで動く。といった感覚に慣れておく必要がありそう。



追記

JSSleep() なる関数を公開されていたのでDBに絡めて使ってみた

function JSSleep(sec) 
{
var start = new Date;
while (1) {
var cur = new Date;
if (sec * 1000 <= cur.getTime() - start.getTime())
{
break;
}
}
}

window.onload = function()
{
var db = window.openDatabase("TESTDATABASE", "1.0", "Wait TEST", 1*1024*1024)

var openTx = function(tx)
{
tx.executeSql(
"CREATE TABLE if not exists tblTEST (id INTEGER PRIMARY KEY, title TEXT, content TEXT, modified NUMERIC)",
[],
function(tx, rs)
{
console.log("#2")
tx.executeSql(
"SELECT * from tblTEST",
[],
function(tx, rs)
{
console.log("#3")
sqlReturn = "Opend ClientStorage : PageList 作成";
}
);
}
); // executeSql() #1
};
var errorTx = function(err)
{
console.log( "CODE : " + err.code + " ERROR : " + err.message )
};
var complTx = function()
{
console.log( "#4 CLOSE TRANSACTION : SQL COMPLETED." )
};

console.log("#1")
db.transaction(openTx, errorTx, complTx); // ######################

JSSleep( 3 );

console.log("#5")
}


トランザクションを開いている間に #5 がログに表示されていたり。

引数に長時間指定すると確実にブラクラになると思われ。

実際試してみると JSSleep() は、無意味なコードだった。

ジャンプ先の記事の日付を見れば分かると思うのですが、「今となっては」と補足しておきます。








silverlight2_games at 16:52│Comments(0)TrackBack(0)

トラックバックURL

コメントする

名前
URL
 
  絵文字