我正在使用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对象?
答案 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
所以它不可能立即返回该值,因为它不能立即恢复,但是,您可以要求在值准备好时通过回调方法
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()