2011-05-05 44 views
0

繼MDC的Storage文檔,我寫的東西讀一些歷史,並顯示在一個文本框:handleResult在executeAsync上多次調用?

var dbConnection = database.getDBConnection(); 

var getHistoryStatement = dbConnection.createStatement("SELECT destinationUrl FROM uploadHistory ORDER BY id DESC"); 

getHistoryStatement.executeAsync({ 
    handleResult: function(aResultSet){ 
     var newHistoryString = ""; 
     for (var row = aResultSet.getNextRow(); row; row = aResultSet.getNextRow()) { 
      newHistoryString += row.getResultByName("destinationUrl") + "\n"; 
     } 

     document.getElementById("historyText").value = newHistoryString; 
    }, 

    handleError: function(aError){ 
    }, 

    handleCompletion: function(aReason){ 
    } 
}); 

然而,這是失敗,因爲handleResult獲取調用在不同的線程兩次:一個與第3結果和其餘的結果。我找不到the docs中有關此行爲的任何信息,而谷歌什麼也沒有。任何人都知道這種行爲或如何獲得handleResult僅被調用一次的所有結果?

這是在Firefox上運行4

回答

3

我不認爲你的意思是說這是獲取調用不同的線程;該回調總是在調用executeAsync的線程上調用。 handleResult可以被稱爲不止一次,that behavior is documented(雖然你可能沒有看過那個頁面)。

+0

謝謝,我確實錯過了那一頁。我猜它可能不在另一個線程中,但我在那裏有一些alert()語句,並且我一次有兩個顯示,這讓我覺得這兩個回調正在發生。奇怪的是,Chromebug在第一次回調中未能達到斷點。 – RandomEngy 2011-05-05 16:26:06

+0

當顯示警告對話框時,事件循環旋轉,這意味着您的handleResult可以重新進入(這就是爲什麼嵌套的偶數循環通常被認爲是不好的原因)。 – sdwilsh 2011-05-08 00:13:23