2013-02-09 45 views
0

在我的firefox擴展中,我有一個帶有一些表的sqlite數據庫。使用executeAsync(),我更新了表格,插入了一些新的數據並選擇了一些值。選擇案例會導致一些問題。如何將結果返回給調用函數(開發一個Firefox擴展)

在handleCompletion()函數中,我可以將檢索到的數據從表中傳遞給另一個函數(並且可以提醒結果)。但我想將結果傳回給調用函數。我在網上搜索了我的問題的答案,但我找不到解決方案。

我發現:

retrieveData: function() { 
    var rows = new Array(); 

    if (this.dbConn.connectionReady){ 
     statement = this.dbConn.createAsyncStatement("SELECT * " + 
               "FROM 'domains' " + 
               ";"); 

     statement.executeAsync ({ 
      handleResult: function(aResultSet) { 
       var i = 0; 

       for (let row = aResultSet.getNextRow(); row; row = aResultSet.getNextRow()) { 
        rows[i] = row; 
        ++i; 
       } 
      }, 

      handleError: function(anError) { 
       alert("error"); 
      }, 

      handleCompletion: function(aReason) { 
       if (aReason != Components.interfaces.mozIStorageStatementCallback.REASON_FINISHED) { 
        // something went wrong 
        alert("error2"); 
       } 
      } 
     }); 
    } 

    return rows; 
} 

此代碼不會返回預期的結果。該語句在該方法返回數組「行」後執行。所以,我的通話功能永遠不會收到表中的數據...

我該如何解決這個問題?有沒有像返回表的數據行超時?

非常感謝您的幫助!

回答

1

你應該理想的是在上面的例子中處理回調。這就是SQLite API開發人員如何使用API​​的原因。 :)

retrieveData: function(_callback) { 
    ... 
    statement.executeAsync ({ 
     ... 
     handleCompletion: function(aReason) { 
     ... 
     _callback(rows); 
     } 
    }); 
} 

你在哪裏調用函數:

retrieveData(function(rows) { 
    // do stuff with rows here 
}); 
+0

謝謝你的解決方案。正是我需要的。我從來沒有在任何論壇上看到過這種可能性...... – kwonilchang 2013-02-12 20:29:49