Javascript & PouchDB: не может вернуть массив объектов, поступающих из pouchdb (потому что он асинхронный?) - PullRequest
0 голосов
/ 10 октября 2018

Я использую JS и PouchDB в проекте Cordova.Структура базы данных 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"}]
};

У меня есть функция, которая должна возвращать массив объектов, а именно из экземпляров полей:

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);
    });
}

Запрос кбаза данных работает, но ObjDandD не передается при возврате.Сначала я подумал, что это потому, что PouchDB работает асинхронно, и значение не разрешается при возврате, но использование async / await не помогло:

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

Просто продолжает выдавать ошибку TypeError:

TypeError: Ob is undefined

Кто-нибудь может мне помочь с этим?Я отчаянно искал безрезультатно.Спасибо.

1 Ответ

0 голосов
/ 10 октября 2018

Проблема в том, что ваш queryDbForDatesAndDuration фактически ничего не возвращает.Поэтому, пока вызов db работает нормально, а ваш objDandD объект действительно установлен, это все, что нужно.Чтобы это работало, вы можете вернуть обещание, сгенерированное 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 также должен работать.

...