javascript - 在 Promise.all() 中将未定义的方法 promise 添加到稍后要解析的数组
问题描述
我想将连接后将执行的数据库调用排队。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。
解决方案
您可以在 db 模块中做出承诺,而不仅仅是localDb
属性:
let localDb = null;
let resolveLocalDb = null;
let localDbPromise = new Promise(function(resolve, reject) {
resolveLocalDb = resolve;
});
var db = {
getLocalDb: () {
return localDbPromise;
}
connectLocal: (dbName) => {
// Do stuff
localDb = new PouchDB(dbName) // has a allDocs() method
resolveLocalDb(localDb);
}
}
然后,交换.localDb
到getLocalDb()
,它返回一个承诺。
dbQueue.push(
db.getLocalDb().then(db => db.allDocs())
)