Javascript 我如何在没有承诺的情况下从数据库获取对象?
我正在使用jquerydatatables,对于我的一列,我正在根据默认数据更改用户看到的值。范例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
...,
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()