2013-10-29 169 views
1

我需要運行SQL SELECT語句並存儲結果。然後我需要將這些結果傳遞給一個函數,並根據給定的數據點創建一個圖。見下面的代碼。JavaScript在第一次完成前執行第二行代碼

var dataKWhr = getCoverageAndKWhr(); 
console.log(dataKWhr); 

createGraph(dataKWhr); 

console.log("Created graph"); 

getCoverageAndKWhr功能開始運行,但原函數的其餘部分繼續與日誌語句和createGraph。這會失敗,因爲此時dataKWhr未定義,因爲它的值尚未從getCoverageAndKWhr()返回。

我寧可不延遲固定的秒數。在繼續之前是否有辦法等待第一行完成?

這是一個帶有jQueryMobile的PhoneGap應用程序。目前正在Android上測試。

+1

你將需要傳遞一個回調函數getCoverageAndKWhr(),以便按照你想要的方式工作。 –

+0

如果getCoverAndKWhr中有任何異步代碼,您將需要一個回調函數,如@ErrolFitzgerald所述。 – Markasoftware

+0

[獲取Webkit的executeSql事務返回值]的可能的重複(http://stackoverflow.com/questions/740523/getting-a-webkit-executesql-transaction-to-return-a-value) –

回答

2

如果沒有getCoverageAndKWhr函數背後的代碼,很難分辨真正發生了什麼。

也許某些執行路徑沒有返回值。

getCoverageAndKWhr也可以異步執行。如果是這種情況,您必須找到一種方法將getCoverageAndKWhr轉換爲同步調用或傳遞一個回調函數,一旦getCoverageAndKWhr執行完成,就會調用該函數。

+0

Thx,I需要一個回調函數。 –

1

任何I/O操作都會異步。任何對SQLite/WebSQL DB的調用都會有回調作爲其構建的一部分。你需要利用它們。 (然後,當你學習討厭回調設計模式時,你可能希望轉換爲Promises。)

1

我發現當你用Javascript編程時,總是認爲每個函數都是異步。這就是爲什麼像這樣的東西是一個禁忌:

var dataKWhr = getCoverageAndKWhr(); 
createGraph(dataKWhr); 

你需要使用回調,這是確保它的使用之前,你的變量將填充唯一現實的途徑。因此,它應該看起來更像是這樣的:

getCoverageAndKWhr(createGraph); 

而且我不知道什麼是在getCoverageAnKWhr,但如果你調用Ajax在那裏它會是這個樣子:

function getCoverageAndKWhr(callBack) { 
    $.ajax({ 
     type: 'GET', 
     //whatever else 
     success: function (data) { 
      callback(data.KWhr); 
     } 
    }); 
} 
相關問題