2011-08-30 69 views
1

我正在開發一個使用HTML5和Web數據庫存儲的應用程序。在主函數回調中獲取返回值

我想在一個表中插入的行並返回新的ID(表的主鍵)創建的使用:

function insertIntoTable(title, text, sketchFileName, categoryId) 
{ 
    var db = window.openDatabase('xxx', '1.0', 'xxx database', 5*1024*1024); 
    var returnedId = -1; 
    db.transaction(
     function (tx) { 
      if (sketchFileName == '') 
      { 
       tx.executeSql('INSERT INTO TableXXX (title, content, created, categoryID) VALUES (?, ?, ?, ?)', 
          [title, text, Date.now(), categoryId], 
          function (transaction, resultSet) { 
           if (resultSet.rowsAffected) { 
            returnedId = resultSet.insertId; 
           } 
          }, handleSQLError); 
      } 
     }, handleSQLError); 
    ); 

    return returnedId; 
} 

但我總是得到-1。我使用Safari開發模式查看錶格中的新行。

有什麼建議嗎?

+0

你可以提醒resultSet.rowsAffected,看看它是真的還是假的。 – DoctorMick

+0

我已經添加了一個提醒,它是真的。 – VansFannel

回答

1

如果您將returnedId的聲明移至該函數的外部,然後再次調用該函數,則會看到返回的值是第一個插入的ID,因此它將被設置。它看起來像是,因爲數據庫是異步的,所以在你的函數返回之後就會設置id,這是有道理的。

根據W3C規範,應該有一個openDatabaseSync可以用來代替openDatabase,但我無法在Safari(5.0.1)中使用它。

很明顯,我不知道你的代碼看起來像你已經發布的代碼片段,但希望你能夠重構它,所以你不需要返回值,而是可以管理返回id在回調中。

+0

我稍後需要此ID。也許,用戶想編輯文本,我需要它來更新該行。 – VansFannel