2012-06-22 35 views
5

tôi sử dụng hai sự kiện khác nhau cho các callback để trả lời khi giao dịch IndexedDB kết thúc hoặc là thành công:Indexeddb: Sự khác biệt giữa việc sử dụng và không đầy đủ?

Hãy nói rằng ... db: IDBDatabase đối tượng, tr: IDBTransaction đối tượng, os: IDBObjectStore đối tượng

tr = db.transaction(os_name,'readwrite'); 
os = tr.objectStore(); 

trường hợp 1:

r = os.openCursor(); 
r.onsuccess = function(){ 
    if(r.result){ 
     callback_for_result_fetched(); 
     r.result.continue; 
    }else callback_for_transaction_finish(); 
} 

trường hợp 2:

tr.oncomplete = callback_for_transaction_finish(); 

Nó là một sự lãng phí nếu cả hai người trong số họ làm việc tương tự. Vì vậy, bạn có thể cho tôi biết, có sự khác biệt nào giữa chúng không?

+0

Đây là một câu hỏi lớn – buley

Trả lời

8

Trong khi đó là sự thật những callbacks chức năng tương tự như họ không giống nhau: sự khác biệt giữa onsuccessoncomplete là giao dịch complete nhưng yêu cầu, được thực hiện trên các giao dịch, là successful.

oncomplete chỉ được xác định trong the spec liên quan đến giao dịch. Giao dịch không có số gọi lại onsuccess.

+0

bạn đã có nghĩa là khi một giao dịch hoàn tất, điều đó không có nghĩa là toàn bộ quá trình xử lý thành công, bẩm sinh? – Dagon

+2

có, điều đó có nghĩa là giao dịch đã hết hạn và đã cam kết – buley

8

Xin lỗi vì nâng lên khá một chủ đề cũ, nhưng đó là câu hỏi là một điểm khởi đầu tốt ...

Tôi đã nhìn cho một câu hỏi tương tự nhưng trong một trường hợp sử dụng khác nhau chút và thực sự không tìm thấy câu trả lời tốt hay ngay cả những người gây hiểu nhầm.

Hãy suy nghĩ về trường hợp sử dụng khi bạn cần phải thực hiện một số viết vào đối tượngStore thậm chí thành nhiều đối tượng. Bạn chắc chắn không muốn để quản lý từng chữ viết đơn và sự kiện thành công và lỗi của riêng nó. Đó là ý nghĩa của giao dịch và điều này là (đúng) thực hiện nó cho IndexedDB:

var trx = dbInstance.transaction([storeIdA, storeIdB], 'readwrite'), 
    storeA = trx.objectStore(storeIdA), 
    storeB = trx.objectStore(storeIdB); 

    trx.oncomplete = function(event) { 
     // this code will run only when ALL of the following requests are succeed 
     // and only AFTER ALL of them were processed 
    }; 
    trx.onerror = function(error) { 
     // this code will run if ANY of the following requests will fail 
     // and only AFTER ALL of them were processed 
    }; 

    storeA.put({ key:keyA, value:valueA }); 
    storeA.put({ key:keyB, value:valueB }); 
    storeB.put({ key:keyA, value:valueA }); 
    storeB.put({ key:keyB, value:valueB }); 

Clue sự hiểu biết này là để được tìm thấy trong các tuyên bố sau của W3C spec:

Để xác định nếu giao dịch thành công, hãy nghe sự kiện hoàn thành của giao dịch thay vì sự kiện thành công của yêu cầu cụ thể, bởi vì giao dịch có thể vẫn không thành công sau khi sự kiện thành công kích hoạt.

+0

chỉ là những gì tôi đang tìm kiếm. tôi giả sử objectStore.onsuccess và objectStore.oncomplete cũng có thể được sử dụng cho nhiều .add,. nhận được, .put, vv ... trên đối tượng đã cho. –

2

tôi sẽ chỉ cảnh báo rằng không có garentee rằng nhận được một trx.oncomplete thành công có nghĩa là các dữ liệu được ghi vào đĩa/cơ sở dữ liệu:

Chúng tôi đang nhìn thấy một vấn đề với trx.oncomplete nơi dữ liệu là không được ghi vào db trên đĩa. FireFox có giải thích về những gì họ đã gây ra sự cố này tại đây: https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction/oncomplete

Dường như cửa sổ/cạnh cũng gặp vấn đề tương tự. Về cơ bản, không có đảm bảo rằng ứng dụng của bạn sẽ có dữ liệu được ghi vào cơ sở dữ liệu, nếu/khi người dùng quyết định giết hoặc tắt thiết bị. Chúng tôi thậm chí đã cố gắng chờ đợi đến 15 phút trước khi tắt trong một số trường hợp và chưa thấy dữ liệu được ghi. Đối với tôi, tôi luôn muốn đảm bảo rằng một dữ liệu ghi hoàn thành và được cam kết.

Có các giải pháp khác cho một cơ sở dữ liệu dai dẳng thực sự, hoặc cải tiến đối với IndexedDB ngoài FF add nghiệm ...

Các vấn đề liên quan