Обещания Javascript - Попытка использовать Async и Await из разных функций - PullRequest
0 голосов
/ 28 мая 2019

Хотя я думал, что правильно использую ключевые слова Async и Await, похоже, что я делаю что-то не так.

Я использую PouchDB, отличную базу данных Javascript, которая синхронизируется с CouchDB.PouchDB использует обещания для многих своих функций и имеет встроенную поддержку 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.Любые предложения относительно того, что я делаю неправильно?

Ответы [ 3 ]

3 голосов
/ 28 мая 2019

getLocalDBInfo () не возвращает обещание, поэтому вы не можете его дождаться.

с асинхронным ожиданием / ожиданием вы можете:

async function getLocalDBInfo(db){
    try{
       return await db.info()
    } catch (err){
       console.log("can't get local DB info: ", error);
    }
}

вы также можете использовать новое обещание

1 голос
/ 28 мая 2019

getLocalDBInfo генерирует обещание, присоединяет к нему обратный вызов и возвращает undefined.Он не возвращает выполненное обещание, и вы не можете ждать на undefined (ну, вы можете, но он ничего не сделает).

Вы должны изменить getLocalDBInfo на фактический return обещание.

Кроме того, почему у вас есть блок then с подписью info => info?Все, что нужно сделать, - это развернуть асинхронное значение, а затем снова обернуть его.Вы можете полностью опустить обратный вызов then.

Точно так же вы уверены, что вам нужно обернуть вызов db.info в попытку / перехват?Интересно, вы могли бы вместо этого использовать promise.catch здесь?Конструкция try / catch захватывает обещания, только когда awaiting выражение.

0 голосов
/ 28 мая 2019

Вам необходимо вернуть значение из внешней функции getLocalDBInfo

function getLocalDBInfo(db) {
  return new Promise((resolve, reject) => {
    db.info()
      .then(info => resolve(info))
      .catch(err => reject(err))
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...