【发布时间】:2017-08-27 00:34:21
【问题描述】:
我并不是一个真正的 Promise Ninja,我知道我做错了什么。但是我找不到我所遇到的一些特殊/相似的问题。
问题:我为 IndexedDB 使用 Dexie.js 包装器,它是异步的。我有一个全局数据库,它指向其他一些 dexie 数据库。
function handleDatabases() {
var result = [];
db.jobs.orderBy('title').filter(function(job) {
return job.someBooleanCondition;
}).each(function(job, cursor) {
let jobDetails = new Dexie(job.correspondingDB);
jobDetails.version(1).stores({
details: 'key,value1,value2'
});
jobDetails.details.get(someKey).then(function(detail) {
result.push({job: job, detail: detail});
})
}).catch(function(error) {
console.log(error);
});
handleResult(result);
}
我已经用一种可能很奇怪的形式为 SO 重写了它,但最终目标是我可以使用数组 result 来处理一些更新。但是,由于它是异步的,因此它始终为空,直到您在控制台中检查它,它永远不会为空。如何将其重写为同步?
【问题讨论】:
-
当结果仅异步可用时,您不能期望返回结果。所以你必须一直坚持承诺(每次返回它们),并且让你的函数也返回一个承诺。调用者必须使用
then允许(异步)访问结果。 -
-
好的,您可能想检查是否可以不创建(新)承诺,因为
get(...).then(...)已经返回了承诺。所以就退回那个。 -
抱歉坚持,但如果你在
then回调中返回{job: job, detail: detail}而不是将其推送到result,它应该可以在没有新承诺的情况下工作,不是吗? -
您能否在问题的附录中分享您最新版本的代码?然后我确定我从工作代码开始,然后再进行调整;-)
标签: javascript promise dexie