首先,我无法为此问题找到合适的标题 - 请随时修改。
我有以下函数从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
方法。
答案 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);
});