2012-05-07 32 views
4

我的代碼是這樣的:我怎樣才能把多個請求在一個事務中IndexedDB的

... 
var f1 = function(trans) { 
    var store = trans.objectStore('ObjectStore'); 
    store.clear(); 
}; 
var f2 = function(trans) { 
    var store = trans.objectStore('ObjectStore'); 
    store.add({id: 1, data: 'text'}); 
}; 
... 
var trans = DB.connection.transaction(['ObjectStore'], IDBTransaction.READ_WRITE); 
trans.onerror = function() { alert('ERROR'); }; 
trans.oncomplete = function() { alert('DONE'); }; 
... 

問題我們,我得到的clear後出現的第二個請求例外DONE警報權利。

是否有可能在IndexedDB中「重用」事務?

UPD:我發現上面的代碼正常工作,因爲我期待在最新的Chromium nightly build中。

回答

4

According to Jonas Sicking,Mozilla開發者和IndexedDB的合作者作家,當最後一次回調觸發時,一個事務被提交。所以要保持一個事務處於活動狀態,你應該能夠通過連續的回調來重用它。

您使用上面的oncomplete,但onsucess也應該同樣適用。

您可以找到事務對象作爲在回調時返回的請求對象的屬性。

以下句子是不正確「的時候,交易變量超出範圍,沒有更多的請求 可以放在反對今天的交易自動提交 」。

當變量超出 範圍時,事務從不自動提交。一般而言,只有當最後一次成功/錯誤回調觸發 時纔會提交,並且該回調計劃沒有更多請求。所以它不是 與任何變量的範圍有關。

唯一的例外是,如果您創建了一個事務,但不會對其發出 請求。在這種情況下,當你返回到事件循環時,交易「儘快」 (無論對於沒有請求的交易而言意味着什麼) 。在這種情況下,只要 的所有引用超出範圍,就可以在技術上「提交」該事務,但這不是 優化的特別有趣的用例。

根據下spec example,你應該能夠找到交易對象爲evt.transaction,你可以做一個新的事務,並添加新的onsuccess事件偵聽器。

var request = indexedDB.open('AddressBook', 'Address Book'); 
request.onsuccess = function(evt) {...}; 
request.onerror = function(evt) {...}; 
+0

謝謝你的回答。你能舉個例子嗎? – Fedor

+0

很難爲IDB發佈完整的示例代碼(在查詢之前需要創建對象庫和數據添加設置代碼),但我已經添加了一些關於在哪裏可以找到事務的信息(它是傳遞給'onsuccess ')。使用該事務對象就像使用任何其他事務對象一樣,所以無論你爲此擁有什麼代碼都應該再次工作。 – buley

相關問題