У меня есть приложение, которое содержит базу данных indexeddb.Это сохраняет информацию на некоторое время.Если эта информация не была передана на сервер, например, из-за сетевой ошибки, для параметра synced установлено значение false.Теперь я хочу создать функцию, которая сможет загружать элементы со статусом: «synced: false» на сервер.
Идея состоит в том, чтобы перебирать базу данных и каждый раз, когда есть запись с false, загружатьэто к серверу и при успешном обновлении значения в локальной базе данных (indexeddb).
У меня проблема в том, что я не могу понять, как я могу позволить операции курсора ждать ответа отсервер (REST API), а затем выполните соответствующие действия (обновите локальное значение «synced: false» -> «synced: true». Обновление на сервере идет хорошо.
Вот рабочий Stackblitz, который показывает полныйкод на домашней странице:
https://stackblitz.com/edit/ionic-thu3eg
Выход находится в консоли. Это пример с актуальной проблемой.
update() {
var callstring: string;
let nowTime = new Date().toISOString();
let nowTimes = dateFns.format(nowTime, 'YYYY-MM-DD HH:mm:ss');
var headers = new Headers();
headers.append("Accept", "application/json");
headers.append("Content-Type", "application/json");
let options = new RequestOptions({ headers: headers });
const dbPromise = openDb('testdb', 1);
dbPromise.then(async db => {
const tx = db.transaction('scans', 'readwrite');
tx.objectStore('scans').iterateCursor(async cursor => {
if (!cursor) return;
if (cursor.value.synced == 'false') {
console.log(cursor.value);
await new Promise((resolve, reject) => {
this.http.get('https://jsonplaceholder.typicode.com/posts/1')
.map(res => res.json())
.subscribe(res => {
console.log('response : ', res.id);
resolve(res)
return callstring = res.id;
}, error => {
reject(error)
});
});
if (callstring == '1') {
console.log('do something : ', callstring);
cursor.value.synced = 'true';
cursor.value.time = nowTimes;
cursor.update(cursor.value);
} else {
console.log('sorry too late');
}
}
await cursor.continue();
});
await tx.complete.then(() => console.log('done cursoring'));
}).then(() => {
this.toastCtrl.create({
message: "DB updated",
duration: 2000,
position: 'top',
cssClass: "toast-mess"
}).present();
});
}
Так что если callstring = 1, тов indexeddb следует обновить значение «false» до «true».
Как мне решить эту проблему? Спасибо