Javascript & PouchDB : 不能 return 来自 pouchdb 的对象数组(因为它是异步的?)

Javascript & PouchDB : can not return array of objects coming from pouchdb (because it is asynchronous?)

我在 Cordova 项目中使用 JS 和 PouchDB。 PouchDB数据库结构如下:

var act = {
  _id: <some_id>,
  activity: <some_description>,
  totaltime: <string_represeting_duration>,
  instances: [{datum: "04/04/18", tijd: "01:10"},{datum: "04/04/18", tijd: "00:35"}]
};

我有一个函数应该 return 对象数组,即来自字段实例:

function queryDbForDatesAndDuration(todo) {
    var objDandD = [];

    db.get(todo._id).then(function(doc) {
        var t = doc.instances.length;
        for(i=0; i<t; i++) {
            objDandD[i] = {
                datum: doc.instances.datum,
                tijd: doc.instances.tijd
            };
        }
    }).then(function(response) {
        console.log(objDandD);
        return objDandD;
    }).catch(function (err) {
        console.log("And error occured while querying the DB for date and duration: " + err);
    });
}

对数据库的查询有效,但 returned 时未传递 ObjDandD。我首先认为这是因为 PouchDB 异步工作并且在 returned 时未解析值,但是使用 async / await 没有帮助:

async function createSingleAct(todo) {
    ...
    var Ob = await queryDbForDatesAndDuration(todo);
    ...

它只是不断给出一个 TypeError :

TypeError: Ob is undefined

任何人都可以帮助我吗?我一直在拼命寻找没有结果。谢谢。

问题是您的 queryDbForDatesAndDuration 实际上 return 什么都没有。因此,虽然 db 调用工作正常,并且您的 objDandD 对象确实已设置,但仅此而已。为了让它起作用,您可以 return db.get 生成的承诺。例如:

function queryDbForDatesAndDuration(todo) {
  var objDandD = [];

  return db.get(todo._id).then(function(doc) {
    var t = doc.instances.length;
    ...

但这也使 queryDbForDatesAndDuration 成为一个异步函数,因此调用者将需要使用 .then() 来访问结果。例如:

queryDbForDatesAndDuration(someTodo).then(objDandD => {
  // do something with objDandD here
})

或者,正如您在问题中提出的那样,await 也应该有效。