0

我有一个从 IndexedDB 返回对象数组的承诺:

const syncData = () => {
  return new Promise((resolve, reject)=>{
      var all_form_obj = [];
      var db = self.indexedDB.open('Test');
      db.onsuccess = function(event) {
          var db = this.result
          // Table new_form
          var count_object_store_new_form = this.result.transaction("new_form").objectStore("new_form").count()
          count_object_store_new_form.onsuccess = function(event) {
              if(count_object_store_new_form.result > 0){
                  db.transaction("new_form").objectStore("new_form").getAll().onsuccess = function(event) {
                    var old_form_arr = event.target.result
                    for(element in old_form_arr){
                        all_form_obj.push(old_form_arr[element])
                    }
                  }
              }
          }
          // Table old_form
          var count_object_store_old_form = this.result.transaction("old_form").objectStore("old_form").count()
          count_object_store_old_form.onsuccess = function(event) {
            if(count_object_store_old_form.result > 0){
              db.transaction("old_form").objectStore("old_form").getAll().onsuccess = function(event) {
                var old_form_arr = event.target.result
                for(element in old_form_arr){
                    all_form_obj.push(old_form_arr[element])
                }
              }
            }
          }
      }

      db.onerror = function(err) {
        reject(err);
      }
      resolve(all_form_obj)
  })
};

解析数组后,我在同步事件中调用承诺:

self.addEventListener('sync', function(event) {
  if (event.tag == 'sync_event') {
    event.waitUntil(
      syncData()
      .then((form_arr)=>{
        console.log(form_arr)
        for(form in form_arr) {
          console.log(form_arr)
        }
    }).catch((err) => console.log(err))
    );
  }
});

在我的承诺 syncData 的“then”中,我打印到控制台两次。
第一个 console.log 出现在控制台(我的对象数组)中,但第二个在循环中(for in)没有出现在控制台中,我不明白为什么。
我的目标是能够遍历每个对象并使用 fetch 将其发送到我的数据库,但问题是循环中的代码没有运行。

我的第一个控制台日志的结果: 在此处输入图像描述

4

1 回答 1

0

我认为resolve没有放置在所需的位置,第二个 console.log 没有出现的原因是form_arr 因为[]. 我简化了您的代码以演示它为什么会这样[]db.onsuccess并且db.onerror只是在那里定义而没有被调用。要解决此问题,您可能需要放置resolveinsidedb.onsuccessrejectinside db.onerror

const syncData = () => {
  return new Promise((resolve, reject)=>{
      var all_form_obj = [];
      var db = self.indexedDB.open('Test');
      db.onsuccess = function(event) {
        // ... will be called async

        resolve(all_form_obj)
      }

      db.onerror = function(err) {
        // ... will be called async
      }

      // remove resolve here
  })
};
于 2021-04-22T08:41:29.343 回答