gpt4 book ai didi

javascript - 在 Dexie 迭代中使用 Promise

转载 作者:行者123 更新时间:2023-11-28 14:55:12 26 4
gpt4 key购买 nike

我并不是真正的 promise 忍者,我知道我做错了什么。但是,我找不到与我遇到的问题相关的特定/类似问题。

问题:我对 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);
}

我已经用一种可能奇怪的形式重写了它,但最终目标是我可以使用数组 result处理一些更新。但是,由于它是异步的,因此它始终为空,直到您在控制台中检查它,它永远不会为空。我怎样才能将其重写为同步?

最佳答案

当结果仅异步可用时,您不能期望返回该结果。

所以你必须始终坚持 promise (每次都返回它们),并让你的函数也返回一个 promise 。调用者必须使用 then(或 await,如果支持)来允许(异步)访问结果。

不要将{job:job,detail:detail}推送到results变量,而是将其返回。它将成为 jobDetails.details.get(..).then(..) 的 promise 值。如果您也返回该值,您将拥有一组 Promise,然后可以使用 Promise.all

来解析它们

避免创建新的 Promise,因为这通常会导致 promise constructor antipattern .

还要避免使用在多个回调中使用而不作为参数传递的变量(例如结果)。相反,尝试构造该数组并将其作为 promise 值返回,以便可以在下一个 then 回调中使用它。

这是建议的(未经测试的)代码:

function handleDatabases() {
db.jobs
.orderBy('title')
.filter(job => job.someBooleanCondition)
.toArray(jobs =>
jobs.map(job => {
let jobDetails = new Dexie(job.correspondingDB);
jobDetails.version(1).stores({
details: 'key,value1,value2'
});
return jobDetails.details.get(someKey)
.then(detail => ({job: job, detail: detail}))
}) // is returned
)
.then(result => Promise.all(result))
.then(handleResult)
.catch(error => console.log(error));
}

关于javascript - 在 Dexie 迭代中使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com