javascript
  • html
  • html5
  • 2012-12-03 203 views -1 likes 
    -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); 
        } 
    

    回答

    0

    傳遞一個回調函數CheckRunning

    CheckRunning(current[0], function(isRunning){...}) 
    ... 
    function CheckRunning(tabel, callback) 
    { 
        var isRunning = null; // we don't know yet 
        .... 
        callback(isRunning); 
    } 
    

    它類似於你tx.executeSql函數,它接受checkRunningSuccess作爲回調。在這種情況下,函數名稱被硬編碼爲checkRunningSuccess,您可以在checkRunning中執行相同的操作。


    順便說一句,如果這是在運行SQL查詢公共Web應用程序讓你容易受到SQL injection attacks

    +0

    我不確定你的意思,以及如何幫助我。如果我做了回調,代碼仍然會立即執行 –

    +0

    @AbdullahGheith不,它不會。當你有結果時調用checkrunningSuccess',對嗎?所以,直到你用結果調用你的回調函數,代碼纔會被執行。您需要將所有依賴於「isRunning」的代碼放入回調中。如果你不想使用回調,你可能會修改'executeSql'函數來使用同步ajax調用。一旦異步運行調用並使用回調函數(在上面的代碼中執行該操作),就無法延遲返回值直到其可用。 –

    +0

    我有點明白你要去哪裏。問題是我沒有收到checkRunningSuccess之前的結果。那麼它將如何知道我的成功時機?我已經這樣做了,它仍然是一樣的:http://pastebin.com/5uSP4sLm(從我的按鈕調用cr()) –

    相關問題