5

Veri yükleniyor ve bunları indexeddb veritabanında saklayın. Periyodik olarak veritabanı çöküyor ve ona erişimini kaybettim. Bana, lütfen, bir çözümün asenkron olarak indexeddb kullanılmasını sağlayın! BenAsenkron olarak IndexedDB ile nasıl çalışır?

Örnek kod şimdi kullanın: Sen uyumsuz IndexedDB veri yüklemek ve kaydetmek için vaat kullanabilirsiniz

var dataTotal = 0; 
var threads = 6; 

//openIndexeddbConnection(); 

function start(total){ 

dataTotal = total; 
    for (var i = 0; i < threads; i++) { 
    loadData(i); 
    } 
} 

function loadData(dataNum){ 
    var dataNext = dataNum + threads; 
    if(dataNext > dataTotal){ 
    //checkEnd(); 
    return; 
    } 

    $.ajax({ 
    url: baseUrl, 
    data: {offset: dataNum}, 
    success: function (data) { 
     successData(dataNext, data); 
    }, 
    type: 'GET' 
    }); 
} 

function successData(dataNext, data){ 
    var dataArray = data.split(';'); 

    saveData(dataArray); 

    loadData(dataNext); 
} 

function saveData(dataArray){ 

    putItem(); 
    function putItem(i) { 
    var count = i || 0; 
    if(dataArray.length <= i){ 
     return; 
    } 

    var transaction = Indexeddb.transaction([dataTableName], "readwrite"); 
    transaction.onsuccess = function (event) { 
     //continue 
     putItem(count); 
    }; 
    var objectStore = transaction.objectStore(dataTableName); 

    var request = objectStore.add({data: dataArray[count++]}); 
    } 
} 

cevap

3

. İndekslenmişDB'deki basit bir nesne mağazasına veri yüklemek ve kaydetmek için iki örnek işlev vardır. IndexedDB gelen

Asenkron yükleme:

function loadFromIndexedDB(storeName, id){ 
 
    return new Promise(
 
    function(resolve, reject) { 
 
     var dbRequest = indexedDB.open(storeName); 
 

 
     dbRequest.onerror = function(event) { 
 
     reject(Error("Error text")); 
 
     }; 
 

 
     dbRequest.onupgradeneeded = function(event) { 
 
     // Objectstore does not exist. Nothing to load 
 
     event.target.transaction.abort(); 
 
     reject(Error('Not found')); 
 
     }; 
 

 
     dbRequest.onsuccess = function(event) { 
 
     var database  = event.target.result; 
 
     var transaction = database.transaction([storeName]); 
 
     var objectStore = transaction.objectStore(storeName); 
 
     var objectRequest = objectStore.get(id); 
 

 
     objectRequest.onerror = function(event) { 
 
      reject(Error('Error text')); 
 
     }; 
 

 
     objectRequest.onsuccess = function(event) { 
 
      if (objectRequest.result) resolve(objectRequest.result); 
 
      else reject(Error('object not found')); 
 
     }; 
 
     }; 
 
    } 
 
); 
 
}

Asenkron IndexedDB kaydetme:

function saveToIndexedDB(storeName, object){ 
 
    return new Promise(
 
    function(resolve, reject) { 
 
     if (object.id === undefined) reject(Error('object has no id.')); 
 
     var dbRequest = indexedDB.open(storeName); 
 

 
     dbRequest.onerror = function(event) { 
 
     reject(Error("IndexedDB database error")); 
 
     }; 
 

 
     dbRequest.onupgradeneeded = function(event) { 
 
     var database = event.target.result; 
 
     var objectStore = database.createObjectStore(storeName, {keyPath: "id"}); 
 
     }; 
 

 
     dbRequest.onsuccess = function(event) { 
 
     var database  = event.target.result; 
 
     var transaction = database.transaction([storeName], 'readwrite'); 
 
     var objectStore = transaction.objectStore(storeName); 
 
     var objectRequest = objectStore.put(object); // Overwrite if exists 
 

 
     objectRequest.onerror = function(event) { 
 
      reject(Error('Error text')); 
 
     }; 
 

 
     objectRequest.onsuccess = function(event) { 
 
      resolve('Data saved OK'); 
 
     }; 
 
     }; 
 
    } 
 
); 
 
}

Örnek kullanım kodu

var data = {'id' : 1, 'name' : 'bla'}; 
 

 
saveToIndexedDB('objectstoreName', data).then(function (response) { 
 
    alert('data saved'); 
 
}).catch(function (error) { 
 
    alert(error.message); 
 
}); 
 

 
// Load some data 
 
var id = 1; 
 
loadFromIndexedDB('objectstoreName', id).then(function (reponse) { 
 
    data = reponse; 
 
    alert('data loaded OK'); 
 
}).catch(function (error) { 
 
    alert(error.message); 
 
});

+0

teşekkürler. Gelecekte temiz Promise veya rxjs kullanmak için planlamıştım. Promise ile daha rahat yakalama hataları. Ama ben herhangi bir hata olmadan kod yapmak istiyorum. Ayrıca, örnekte yeni bir indxedDBbut bağlantısı her açtığınızda, ancak sadece bir tane kullanın. Sanırım Concurrency Pattern: Producer and Consumer – Greg

2

IndexedDB'u vaat eden basit bir kitaplık olan idb kullanıyorum. Bunlar, uyumsuz DB eylemlerini çok kullanmayı kolaylaştırır.

Chrome hedefliyorsanız (veya onları destekleyen bir transpiler kullanırken) kodunuzu basitleştirmek için async ve await kullanabiliyorsanız: cevap için

async function saveData(dataArray) { 
    const db = await idb.open('YourDB', currentVersion, upgradeFunction); 
    const tran = await db.transaction('StoreName', 'readwrite'); 
    const store = tran.objectStore('StoreName'); 

    // This will add the items sequentially 
    for(let item of dataArray) { 
     await store.add({data:item}); 
    } 
} 
+0

gibi bir şey kullanmalıyız Cevabınız için teşekkürler. IDB ilginç bir kütüphanedir, ancak IndexedDB ile gereksiz paketleyicileri kullanmadan çalışabilirim. Ayrıca bu kitaplık sorunu IndexedDB engellendiğinde hata yakalamaz. Evet, hedefim krom, ancak beklemeyi kullanmak istemiyorum, kodum diğer tarayıcılarda da çalışmalı, şimdi beta'da bekle/asynch yapmalı ve yavaş çalışmalıyım. – Greg

+0

@Greg - async/await, gelecekteki özelliklerin bir parçası olup, temel olarak bu işlevselliği yürütürken söz vermekten daha yavaş değildir. TypeScript ile bunları kullanabilir ve IE'nin çalışabileceği bir şeye dönüşürler. Babel ile de yapabileceğinizi düşünüyorum, ama bunu kendim yapmadım. Hataların yakalanmasının ne anlama geldiğinden emin değilim - yapması gereken şey bu değil, tek yaptığı geri çağırma işlevlerini vaatlerle sarmak. Söz konusu sonucun sonucu olarak kendi kodunuzdaki hatayı ya da normal bir deneme yakalamada beklemeyi gerçekleştirerek hata saptamanız. – Keith

+0

Muhtemelen bekleyiş/uyumsuzluk hakkında haklısınız, ancak genellikle yeni özelliklerdeki özellikler optimize edilmemiştir. Örneğin yerli vaatler, Polifil'den daha kötü çalıştı. Bir bağlantı açıldığında 'bloke' etkinliği oluşturulur ve daha fazlasını yapmaya çalışırız. Ve bu olayın iki eşzamanlı işlemle çakıştığında tetiklendiğini düşünüyorum. Ve soru, bu hatayı nasıl önlersiniz. – Greg

İlgili konular