虽然我以为我正确使用了Async和Await关键字,但似乎我做错了什么。
我正在使用PouchDB,这是一个与CouchDB同步的出色Javascript数据库。 PouchDB的许多功能都使用了promises,并且对Async和Await具有本机支持。例如,要检索有关数据库的基本信息,您将使用以下代码:
db.info().then(function (info) {
console.log(info);
})
我理解这一点,并且可以正常工作。但是,如果我尝试将其放在一个函数中,然后调用该函数,事情就会变得一团糟。而且我确定是问题所在,而不是PouchDB。
function getLocalDBInfo(db){
try {
db.info().then(function (info) {
return info;
});
} catch (error) {
console.log("can't get local DB info: ", error);
}
}
async function testing(db){
try {
var info=await getLocalDBInfo(db);
await console.log("DB info=", info);
await console.log("Doc count= ", info.doc_count);
}
catch(err){
console.log("error=",err);
}
//info contains...
//{"doc_count":0,"update_seq":0,"db_name":"kittens"}
}
testing(MY_db);
如果我在info
函数中登录getLocalDBInfo
,它将最终(即在诺言兑现之后)将info
登录到控制台。但是,testing
函数中的日志立即返回undefined
。对我来说,他们之所以返回undefined
是因为他们立即返回了,但是我试图通过使用info
和async
让他们等待await
。关于我在做什么错的任何建议吗?
答案 0 :(得分:3)
getLocalDBInfo()没有返回承诺,因此您不能等待它。
使用异步/等待,您可以:
async function getLocalDBInfo(db){
try{
return await db.info()
} catch (err){
console.log("can't get local DB info: ", error);
}
}
您还可以使用new promise
答案 1 :(得分:1)
getLocalDBInfo
生成一个Promise,在其上附加一个回调,然后返回undefined
。它不会返回已解决的承诺,并且您无法等待undefined
(可以,但是它不会做任何事情)。
您需要将getLocalDBInfo
更改为实际上return
的承诺。
此外,为什么您有一个签名为then
的{{1}}块?这一切将要做的是解包异步值,然后再次包装它。您可以完全省略info => info
回调。
同样,您确定需要将then
调用包装在try / catch中吗?我想知道您是否打算在这里使用db.info
。 try / catch构造仅在promise.catch
表达式时才捕获承诺拒绝。
答案 2 :(得分:0)
您需要从外部函数getLocalDBInfo
返回值
function getLocalDBInfo(db) {
return new Promise((resolve, reject) => {
db.info()
.then(info => resolve(info))
.catch(err => reject(err))
})
}