Указатель Indexeddb ждать ответа? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть приложение, которое содержит базу данных 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».

Как мне решить эту проблему? Спасибо

...