承诺回报价值

时间:2019-02-07 14:28:35

标签: javascript vue.js promise

我知道这个问题通过几种方式被问过几次。但是我真的不明白:

我有一个具有解决价值的承诺。我可以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
]

但是我需要的是价值,而不是价值。我不明白如何返回值。

我已经阅读了几本“如何做”。我想,我了解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 :(得分:3)

您可以使用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;
},

答案 1 :(得分:1)

在组件的安装中,您应该更新state doc,然后您的文档才能在组件内部的任何位置使用。

export default {
  data() {
    return {
      doc: [],
      error : ""
    }
  },
  mounted: () => {
    testdb.get('2').then(doc => {
      this.doc = doc;
    }).catch(function(err) {
      this.error = err;
    });
  }
} 

答案 2 :(得分:0)

您示例中的

testDoc现在包含函数。这不是承诺,也不是您从承诺中获得的doc。要获得实际的doc,您需要进入 promise 。像这样

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