IndexDB游标.onsucess作为承诺

时间:2017-09-07 16:31:10

标签: javascript ecmascript-6 indexeddb

首先,我无法为此问题找到合适的标题 - 请随时修改。

我有以下函数从indexDb中读取对象,

"securityDefinitions": {
    "Api Auth": {
        "name": "Authorization",
        "in": "header",
        "type": "apiKey"
    }
}

现在,当我通过简单的函数调用调用此函数时,例如:

var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("Authorization", "Bearer " + authToken, "header");
window.swaggerUi.api.clientAuthorizations.add("bearer", apiKeyAuth);

控制台日志为loadNeededParcels = property => { const dbResults = []; var readTransaction = this.db .transaction("parcelData") .objectStore("parcelData"); readTransaction.openCursor().onerror = e => { console.log("open cursor error ", e); }; readTransaction.openCursor().onsuccess = e => { const cursor = e.target.result; if (cursor) { dbResults.push(cursor.value); cursor.continue(); } else { return dbResults; } }; }; 。我猜这是因为函数不等待光标完成并返回console.log(loadNeededParcels('hasData')) 变量?

所以我的问题是 - 如何将此函数重写为承诺,或者等待undefined触发?

因此预期的结果是函数在退出之前实际返回从数据库中读取的值。

我正在使用游标,因为IE中不支持dbResults方法。

2 个答案:

答案 0 :(得分:0)

我最终使用的简单解决方案:

  loadNeededParcels = property => {
    return new Promise((resolve, reject) => {
      var readTransaction = this.db
        .transaction("parcelData")
        .objectStore("parcelData");
      readTransaction.openCursor().onerror = e => {
        reject(e);
      };
      const dbResults = [];
      readTransaction.openCursor().onsuccess = e => {
        const cursor = e.target.result;
        if (cursor) {
          dbResults.push(cursor.value);
          cursor.continue();
        } else {
          resolve(dbResults);
        }
      };
    });
  };

答案 1 :(得分:0)

尝试这样的事情。不要两次调用openCursor,这会产生两个请求。

function loadNeededParcels(db, property) {
 return new Promise(function(resolve, reject) {
   var results = [];
   var tx = db.transaction('parcelData');
   tx.onerror = function(event) {
     reject(tx.error);
   };
   var store = tx.objectStore('parcelData');

   // Open a cursor over all items
   var request = store.openCursor();

   request.onsuccess = function(event) {
     var cursor = request.result;
     if(cursor) {
       var value = cursor.value;
       if(value) {
         // Only append defined values to the array
         results.push(cursor.value);
       }

       cursor.continue();
     } else {
       resolve(results);
     }
   };
 });
}

loadNeededParcels(db, 'hasData').then(function(results) {
  console.log('Results', results);
}).catch(function(error) {
  console.error(error);
});