Возвращаемое значение в обещании - PullRequest
0 голосов
/ 07 февраля 2019

Я знаю, что этот вопрос задают несколько раз несколькими способами.Но я действительно не понимаю:

У меня есть обещание с разрешенным значением.Я могу console.log этого объекта, и все, кажется, в порядке.Я вижу то, что хочу видеть.

Я использую PouchDB и NuxtJS (VueJS)

import PouchDB from 'pouchdb'

let testdb = new PouchDB('testdb');

let testDoc = function () {
  testdb.get('2').then(function (doc) {
    console.log(doc);
  }).catch(function (err) {
    console.log(err);
  });
}

Это прекрасно работает.Мой результат - это то, что я ожидаю и надеюсь увидеть:

{
   text: "testen", 
   _id: "2", 
   _rev: "1-c7e7c73d264aa5e6ed6b5cc10df35c5a"
}

Отлично.Но сейчас я пытаюсь вернуть это значение, чтобы другие функции могли получить к нему доступ.Особенно возвращаю эти данные.Например, в VueJS:

// ..
export default {
   data() {
      return {
         doc: testDoc
      }
   }
}

Так что я могу получить к нему доступ через экземпляр.Но, конечно, если я сделаю это так, данные обещают

data: [
   doc: promise
]

Но мне нужно значение, а не то, что оно есть.Я не понимаю, как вернуть значение.

Я прочитал несколько How To´s.Я думаю, я понимаю разницу между Callback и Promise.С обеими и асинхронными функциями я получаю одинаковый результат.Но все примеры всегда с console.log ().Но это работает для меня.

Есть ли у кого-нибудь горячий пример для доступа к этому значению (области или вложенности?)?

Если я верну данные:

let testdb = new PouchDB('testdb');

let testDoc = function () {
  testdb.get('2').then(function (doc) {
    return doc;
  }).catch(function (err) {
    console.log(err);
  });
}

Почему не testDoc значение сейчас?Или где хак это значение?

Я всегда делал это, передавая значение в хранилище vuex.Это также прекрасно работает.

let fetchOrga = async function({ store }) {
  try {
    let orgaDoc = await orgadb.get('orga');
    store.commit('orgaUpdate', orgaDoc)
  } catch (err) {
    console.log(err);
  }
}

Но, как я уже сказал, я хочу, чтобы эти данные напрямую контролировались через IndexedDB

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

При монтировании компонента вы должны обновить state doc, тогда ваш документ будет доступен для работы в любом месте внутри вашего компонента.

export default {
  data() {
    return {
      doc: [],
      error : ""
    }
  },
  mounted: () => {
    testdb.get('2').then(doc => {
      this.doc = doc;
    }).catch(function(err) {
      this.error = err;
    });
  }
} 
0 голосов
/ 07 февраля 2019

Вы можете использовать async / await , чтобы дождаться разрешения обещания:

// nuxt.js way
async asyncData() {
  let testdb = new PouchDB('testdb');
  return {
    doc: await testdb.get('2'),
  };
},

UPD (по комментариям):

data() {
  return {
    isReady: false,
    doc: null,
  };
},
async mounted() {
  let testdb = new PouchDB('testdb');
  this.doc = await testdb.get('2');
  this.isReady = true;
},
0 голосов
/ 07 февраля 2019

testDoc в вашем примере теперь содержит функцию .Ни обещание, ни doc вы получаете от обещания.Чтобы получить doc, вам нужно получить обещание .Например,

let testdb = new PouchDB('testdb');

testdb.get('2').then(function (doc) {

    // Your doc is here
    console.log(doc);
    return doc;
}).catch(function (err) {
    console.log(err);
});

В качестве альтернативы вы можете использовать синтаксис async / await , например

let doc = await testdb.get('2');
// Your doc is here
console.log(doc);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...