2013-07-30 67 views
1

我試圖使用indexedDB來存儲離線數據,然後在連接時上傳數據。在下面的代碼中,循環用於從indexedDB讀取數據,併爲表(store)中的每個記錄(對象)創建一個JSON對象並將其發佈到PHP文件中。但是,這個indexedDB循環只執行一次。這是因爲JSON對象是異步發送給服務器的嗎?將循環中的indexedDB數據上傳到PHP

var trans = LocalDB.indexedDB.db.transaction(storename, 
              IDBTransaction.READ_WRITE); 
var store = trans.objectStore(storename); 
var keyRange = IDBKeyRange.lowerBound(0); 
var cursorRequest = store.openCursor(keyRange); 

cursorRequest.onsuccess = function (e) { 
    var result = e.target.result; 
    var obj = new Object; 
    obj.name = result.value.Name; 
    obj.Date = result.value.Date; 
    if (window.XMLHttpRequest) 
     xmlhttp = new XMLHttpRequest(); 
    else 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
     { 
      alert(xmlhttp.responseText);//problem: only shown once 
      result.continue(); 
     } 
    }; 
    xmlhttp.open("POST", "upload.php"); 
    xmlhttp.setRequestHeader("Content-type", "application/json", true); 
    xmlhttp.send(JSON.stringify(obj)); 
}; 
cursorRequest.onerror = function (e) { alert("Error uploading"); }; 

回答

1

如果您檢查控制檯的錯誤,你可能會看到:

Uncaught Error: TransactionInactiveError 

這似乎是由於Ajax請求延遲result.continue()。與此同時,事務顯然變爲不活動狀態,並且不能再被光標使用。

你要的result.continue()搬出onreadystatechange的:

// ... 
xmlhttp.send(JSON.stringify(obj)); 
result.continue(); 

你也可以選擇小號 JAX(同步)。但是,這通常不被推薦。


而且,請注意,onsuccess回調將被稱爲額外的時間與nullresult來表示光標已完成,所以你要測試這一點:

cursorRequest.onsuccess = function (e) { 
    var result = e.target.result; 

    if (!result) { 
     console.log('Done'); 
     return; // exit callback 
    } 

    // ... 
}; 

你可以也使用它來與單個Ajax請求發送整個集合中的Array

var storedCollection = []; 

cursorResult.onsuccess = function (e) { 
    var result = e.target.result; 

    if (result) { 
     storedCollection.push(result.value); 
     result.continue(); 
     return; // exit callback 
    } 

    // else: the cursor is "done" 

    var xmlhttp = new XMLHttpRequest(); 
    // ... 
    xml.send(JSON.stringify(storedCollection)); 
}; 

實施例:http://jsfiddle.net/CZBrd/(檢查控制檯)

+0

謝謝。同意你,我想如果問題不能輕易修復,那麼我應該發佈一個對象數組到PHP。 – HQXU85