首页 > 解决方案 > 在 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。

标签: javascriptasynchronousvue.jspromisepouchdb

解决方案


您可以在 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);
  }
}

然后,交换.localDbgetLocalDb(),它返回一个承诺。

dbQueue.push(
  db.getLocalDb().then(db => db.allDocs())
)

推荐阅读