2012-07-03 73 views
0

這很容易嗎?看起來handleResult方法只在結果不是空集時執行。確定SQL選擇是否異步返回空集?

我想過的是讓handleResult和handleCompletion成爲一個對象的成員函數,並讓handleResult更新handleCompletion可以檢查的成員變量。如果變量被設置,而不是空的,如果變量未設置,則爲空並且可以相應地執行。

似乎過於複雜,希望有更好的解決方案?

回答

1

勾勒出一個解決方案(本以爲我上面有)(EDIT2:每評論我下面進行)

function sql() { 
    this.results = false; 
    var me = this; 

    this.handleResult = function(aResultSet) { 

     for (var row = aResultSet.getNextRow(); row; row = aResultSet.getNextRow()) { 
      me.results = true; 

      var value = row.getResultByName("name"); 
     } 
    }; 

    this.handleError = function(aError) { 
     .... //deal with error 
    }; 

    this.handleCompletion = function(aReason) { 
     if (me.results) { 
      ....//results 
     } else { 
      ....//no results 
     } 

     if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) { 
      ....//handle these 
    }; 
}; 

s = new sql(); 

statement.executeAsync({ 
    handleResult: s.handleResult, 
    handleError: s.handleError, 
    handleCompletion: s.handleCompletion 
}); 

這被認爲是解決這一問題的好辦法?

edit1:這不表現出我期望的方式(它的工作原理,但不是100%肯定爲什麼)。即,如果handleResult永遠不會運行,則this.results變量是未定義的(不是false)。所以它看起來好像handleResult和handleCompletion在一個不同於我預期的變量集合上運行。

任何幫助瞭解我做錯了什麼將不勝感激。

+0

http://w3future.com/html/stories/callbacks.xml是我的問題的答案。 需要var me = this;在sql對象和引用內部變量中由「我」。而不是「這個」。 – spotter