如何在没有承诺的情况下从pouchdb获取对象?

时间:2016-09-17 16:38:06

标签: javascript promise pouchdb

我正在使用jquery数据表,对于我的一个列,我正在根据默认数据更改用户看到的值。实施例

...,
columns: [
  { "title": 'Category', render: function ( data, type, row ) {return db.categoryName(data);}}
],
...

然后在我的函数中,我通过id获取pouchdb对象并返回找到的对象名称

  categoryName(id) {
    return dbQuery.doc(id).then((arg) => {
      console.log("the category name", arg.name);
      return arg.name;
    });
  }

我得到了正确的输出到控制台,但视图显示了每个文档的[object Promise]。当我只是想按照我没有承诺的方式返回价值时,我很难接受承诺。

如何从promise中返回一个值,以便我可以使用categoryName函数?或者有没有另一种方法从pouchdb获取值而不使用promises所以我可以让我的categoryName函数返回一个值而不是一个promise对象?

2 个答案:

答案 0 :(得分:1)

fetch操作是异步的,这就是为什么你只能返回一个promise。

您唯一的另一个选择是传递回调:

categoryName(id, cb) {
  dbQuery.doc(id).then((arg) => {
    console.log("the category name", arg.name);
    cb(arg.name);
  });
}

答案 1 :(得分:1)

PouchDB API docs说:

  

PouchDB有一个异步API

所以它不可能立即返回该值,因为它不能立即恢复,但是,您可以要求在值准备好时通过回调方法

function categoryNameWithCallback(id, cb) {
  // TODO: handle error
  // Note that this method returns undefined
  db.doc(id, (err, doc) => cb(doc.name))
}

或使用承诺

function categoryName(id) {
  return db.doc(id).then(doc => doc.name)
}

您应该阅读kriskowals/q promise library的精彩设计说明,以了解通过简单回调获得通知而不是使用承诺的一些缺点

现在回到你的问题,你可以按如下方式重构你的代码

function render(name) {
  $('#example').DataTable( {
    columns: [
     { "title": 'Category', render: function ( data, type, row ) {
        // `name` will be available after the promise is resolved but not immediately
        if (name) return name
        // perform the async operation now and rerender the table when the value is available
        categoryName(data).then(render)
        // render with the default value first
        return data;
     }}
    ]
  })
}

render()