2012-06-03 30 views
4

我是JavaScript新手,嘗試編寫Firefox附加組件。
我想通過/提取從SQL查詢返回到調用函數的數據。 它似乎沒有工作。
我搜索了關於變量範圍的信息,查看了我在本網站上看到的任何相關文章,並嘗試了據說可行的示例,但沒有一個適用於我。從executeAsync將數據返回到調用函數(javascript/mozilla)

我使用的存儲信息來源:
https://developer.mozilla.org/en/Storage
https://developer.mozilla.org/en/mozIStorageStatement

,該怎麼辦錯了,還是我應該怎麼做呢?
我在xp上運行firefox 12。

function Sqlite() { 
    this.dbConn = ""; 
    this.empty = true; 
} 

Sqlite.prototype.retrieveData = function(query) 
{ 
    var rows = new Array(); // to be returned to the calling function 
    var stmt = this.dbConn.createStatement(query); // my "select..." statement 

    stmt.executeAsync ({ 
    handleResult: function(aResultSet) 
    { 
     this.empty = false; 
     var i = 0; 
     for (let row; row = aResultSet.getNextRow();i++) { 
      rows[i] = row; 
     } 
    }, 

    handleError: function(anError) { 
     //some code 
    }, 

    handleCompletion: function(aReason) { 
     if (this.empty) { 
      // CODE FOR WHEN STATEMENT EXECUTION IS FINISHED 
     } 
     if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) { 
      document.getElementById("debug").value = rows[0]; //gets the data from the query: [xpconnect wrapped mozIStorageRow] 
      return true; 
     } 
    } 
    }); 
    document.getElementById("debug").value = rows[0]; //gets undefined 
    stmt.finalize(); 

    return rows; // the info is no longer available at this point. 
} 

我會很感激你的幫助

回答

4

你在你描述你的問題的方式在某種程度上模糊,但是當你寫:

return rows; // the info is no longer available at this point.

這是當然預計。顧名思義,executeAsync是異步的。這意味着當您撥打executeAsync時,該行動計劃在之後的。 Javascript有一個運行到完成的語義,所以執行將繼續,直到達到return rows聲明。此時,查詢尚未執行!一旦你的函數完成,JS引擎將執行你的異步語句,你的回調函數將被調用。然後由handleCompletion中的代碼來完成數據的任何操作,例如調用另一個函數來處理它。

此外,您的empty變量似乎不需要。

handleCompletion: function(aReason) { 
    if (aReason != Ci.mozIStorageStatementCallback.REASON_FINISHED) { 
    // something went wrong 
    } else { 
    // do something useful with rows 
    } 
}, 

最後,你需要調用row.getResultByName獲得該行一列中的值。

+0

對不起,我覺得我很清楚。但是你明白了,因爲你讓我找到了解決方案。 謝謝。 (我提取的列,但它是不相關的問題) 這是我做的:

 \t handleCompletion: function(aReason) { \t \t if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) { \t \t \t if (!this.empty) { \t \t \t \t return copyRes(rows, myRows, descResults); \t \t \t } \t \t } \t \t else { \t \t Cu.reportError("Async statement execution completed (" + aError.result + \t \t "): " + aError.message); \t \t } \t } 
但是,這是一個優雅的方式來做到這一點? – Laurel

+0

我會給你投票,但我太新了。沒有足夠的代表。 再次感謝您 – Laurel

+0

我認爲您將請求成功返回零行(因爲表爲空)與請求失敗(因爲數據庫已損壞,例如)混淆。否則,是的,這聽起來很好。 –