Javascript 我如何在没有承诺的情况下从数据库获取对象?

Javascript 我如何在没有承诺的情况下从数据库获取对象?,javascript,promise,pouchdb,Javascript,Promise,Pouchdb,我正在使用jquerydatatables,对于我的一列,我正在根据默认数据更改用户看到的值。范例 ..., columns: [ { "title": 'Category', render: function ( data, type, row ) {return db.categoryName(data);}} ], ... 然后,在我的函数中,我通过id获取对象,并返回找到的对象名 categoryName(id) { return dbQuery.doc(id).the

我正在使用jquerydatatables,对于我的一列,我正在根据默认数据更改用户看到的值。范例

...,
columns: [
  { "title": 'Category', render: function ( data, type, row ) {return db.categoryName(data);}}
],
...
然后,在我的函数中,我通过id获取对象,并返回找到的对象名

  categoryName(id) {
    return dbQuery.doc(id).then((arg) => {
      console.log("the category name", arg.name);
      return arg.name;
    });
  }
我获得了控制台的正确输出,但视图显示了每个文档的
[object Promise]
。当我只想以没有承诺的方式回报一个价值时,我很难接受承诺


如何从promise返回一个值,以便使用categoryName函数?或者有没有其他方法可以从PockDB获取值而不使用承诺,这样我就可以让categoryName函数返回值而不是承诺对象?

获取操作是异步的,这就是为什么只能返回承诺

您唯一的其他选择是传递回调:

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

fetch操作是异步的,这就是为什么您只能返回一个承诺

您唯一的其他选择是传递回调:

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

PockDB有一个异步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)
}
您应该阅读针对的很棒的设计说明,以了解通过简单回调而不是使用承诺来获得通知的一些缺点

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

现在回到您的问题,您可以如下重构代码

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()
他们说:

PockDB有一个异步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)
}
您应该阅读针对的很棒的设计说明,以了解通过简单回调而不是使用承诺来获得通知的一些缺点

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

现在回到您的问题,您可以如下重构代码

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