Javascript承诺-尝试通过不同的功能使用Async和Await

时间:2019-05-28 17:46:24

标签: javascript asynchronous async-await

虽然我以为我正确使用了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是因为他们立即返回了,但是我试图通过使用infoasync让他们等待await。关于我在做什么错的任何建议吗?

3 个答案:

答案 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))
  })
}