【发布时间】:2019-06-24 05:00:57
【问题描述】:
我想将连接后将执行的数据库调用排队。 DB 对象在连接时被创建并存储为模块的成员。
数据库模块:
var db = {
localDb: null,
connectLocal: (dbName) => {
// Do stuff
this.localDb = new PouchDB(dbName) // has a allDocs() method
}
}
将呼叫添加到队列:
var dbQueue = []
function getDocs () {
dbQueue.push (
db.localDb.allDocs () // allDocs() not yet defined; returns promise
)
}
// Called when connected and queue is not empty:
function processQueue () {
Promise.all (dbQueue)
.then(...)
}
如果在 db.connectLocal() 设置 db.localDb 之前调用 getDocs(),则会收到以下错误(或类似错误),因为尚未定义 db.localDb:
TypeError: 无法读取未定义的属性“then”
是否可以将返回一个承诺的未定义方法添加到稍后在 Promise.all() 中解析的数组?关于如何解决此问题的任何其他想法?
另外,我正在使用 Vue.js 和 PouchDB。
【问题讨论】:
-
为什么
getDocs()甚至在connectLocal()之前被调用?我认为这是您需要解决的真正问题。 -
我不知道您的队列在做什么或它应该如何工作(但我怀疑它实际上不起作用)。您能否详细说明您需要什么队列以及在哪里(由谁)调用
getDocs和processQueue函数? -
@Bergi,
getDocs()由于各种原因在多个 Vue 组件中被调用 - 一个组件在mount()中调用它,另一个在onclick事件之后调用它。我可以检查是否为每个 DB 调用建立了连接,但这会很多,而且一旦建立连接,我仍然需要一种方法来再次调用它。 -
@Bergi,队列中保存着数据库调用,一旦连接数据库就会被处理。它确实有效,但在这种情况下它不起作用,因为我正在添加一个尚未定义的承诺。它是由 Vue.js 组件进行的众多潜在数据库调用之一。我本可以将整个队列部分排除在我的问题之外,因为这不是问题,但我觉得它有助于说明我的问题。
-
队列部分非常重要,谢谢提及。听起来您在连接后立即调用
processQueue,并且不要对数组结构做太多其他事情。然后,我建议删除数组并为您排队的数据库连接使用承诺,就像下面 Marius 的回答一样。然而,如何最好地初始化这个承诺将取决于connectLocal的调用方式和位置。
标签: javascript asynchronous vue.js promise pouchdb