-1
我正在構建一個顯示播放按鈕或停止按鈕的表格。 (和一些其他的東西)異步調用返回值?
for(var i = 0; i < result.length; i++){
var current = result[i].split("$");
if (CheckRunning(current[0])){
t = t + "<tr><td><img alt='stop' id='img"+i+"' src='stop.png' onclick='ChangeButton(\"img"+i+"\");'/>";
} else {
t = t + "<tr><td><img alt='play' id='img"+i+"' src='play.png' onclick='ChangeButton(\"img"+i+"\");'/>";
}}
這裏的問題是CheckRunning方法。它打開一個數據庫,這是一個異步方法。我不能簡單地做一個返回真/假。那麼解決方案是什麼?總之,這裏是它的代碼:
var tabel;
var running = false;
function CheckRunning(tabel){
this.tabel = "tabel"+tabel+"";
var db = window.openDatabase(this.tabel, "1.0", this.tabel, 1000000);
db.transaction(checkrunningDB, checkerrorCB);
console.log(this.running);
return this.running;
}
function checkrunningDB(tx) {
tx.executeSql('SELECT max(id), sluttime FROM '+this.tabel, [], checkrunningSuccess, checkerrorCB);
}
function checkrunningSuccess(tx, results) {
if (results.rows.item(0).sluttime != null){
this.running = false;
} else{
this.running = true;
}
}
function checkerrorCB(err) {
this.running = false;
console.log(err);
}
我不確定你的意思,以及如何幫助我。如果我做了回調,代碼仍然會立即執行 –
@AbdullahGheith不,它不會。當你有結果時調用checkrunningSuccess',對嗎?所以,直到你用結果調用你的回調函數,代碼纔會被執行。您需要將所有依賴於「isRunning」的代碼放入回調中。如果你不想使用回調,你可能會修改'executeSql'函數來使用同步ajax調用。一旦異步運行調用並使用回調函數(在上面的代碼中執行該操作),就無法延遲返回值直到其可用。 –
我有點明白你要去哪裏。問題是我沒有收到checkRunningSuccess之前的結果。那麼它將如何知道我的成功時機?我已經這樣做了,它仍然是一樣的:http://pastebin.com/5uSP4sLm(從我的按鈕調用cr()) –