2015-02-12 61 views
1

我在另一個問題中發佈了大部分相同的代碼,但我在這裏有一個不同的問題 - 我應該如何理解Javascript異步代碼?瞭解Javascript異步調用

function getUserStatus() { 

    var status; 

    function querySuccess(tx, results) { 
     var len = results.rows.length; 
     var row = results.rows.item(0); 
     console.log(row['id']); 
     status = { 
      question: row['id'] 
     }; 
    } 

    function errorCB(err) { 
     console.log(err); 
    } 

    db.transaction(function(tx) { 
     tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1', [], querySuccess, errorCB); 
    }); 
    querySuccess(); 
    console.log(status); 
    return status; 
} 

我知道我的代碼在變量狀態被定義之前正在執行 - 但是如何在狀態被定義之前停止處理呢?我不希望這個過程是異步的 - 如果數據庫沒有提供任何內容,那麼我不希望操作繼續。

我的印象是我需要調用querySuccess(),但我會傳遞給它什麼參數?

我對Javascript比較新,我以前沒有遇到過這個概念,我對它的工作方式以及如何讓我的代碼執行我想要的方式感到困惑。

+1

它總是同步的。你不需要自己調用'querySuccess',當查詢結束時它會自動調用。將'console.log()'調用放入'querySuccess()'中。 – Barmar 2015-02-12 02:43:53

+0

所有依賴查詢成功完成的查詢都應在'querySuccess()'函數中。你不能從函數中返回'status'。 – Barmar 2015-02-12 02:46:14

回答

1

當我第一次學習異步編程,我發現它更容易通過匿名函數作爲回調:

function getUserStatus(returnCallback) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT id FROM calculator ORDER by id ASC LIMIT 1', [], 
      function(tx, results) { //querySuccess callback 
       var len = results.rows.length; 
       var row = results.rows.item(0); 
       console.log(row['id']); 
       var status = {question: row['id']}; 
       console.log(status); 
       returnCallback(status); 
      }, 

      function(err) { //error callback 
       console.log(err); 
       returnCallback(err);   
      }); 
    }); 
} 

我重寫,並增加了一些東西,你的代碼。希望這會有所幫助:)

不幸的是,我現在沒有時間詳細介紹並解釋所有這些是如何工作的。如果其他人想要編輯這個答案來做到這一點,就直接前進。

好運OP,學習使用異步技術是很難在第一,但真的很容易,一旦你可以在其周圍包裹你的頭:)

+0

Uncaught TypeError:undefined不是函數 – 2015-02-12 04:04:17

+0

我不得不在這段時間內工作很長一段時間,但我終於明白了它,並通過一些額外的閱讀獲得了正確的回調。謝謝您的幫助。 – 2015-02-14 10:57:57