Комбинации обещаний и асинхронного ожидания - идеальный способ ожидания асинхронных операций? - PullRequest
0 голосов
/ 03 июля 2019

Наличие асинхронного / ожидающего в функции само по себе вернет «ожидающее значение», но если используется обещание, то фактическое значение будет возвращено в конце. Это идеальный способ ждать завершения асинхронных операций?

Это возвращает именно то, что я хочу

    var foundForm = await getDocument(query) //Returns the resulting document


 async function getDocument(query){
 return new Promise((resolve,reject) =>{
 MongoClient.connect  (url, async function(err, db) {
if (err) throw err;
 console.log(query)
db.collection("users").find(query).toArray(function(err, result) {
  if (err) {
    console.log(err)
    throw err;
  }
  console.log(result);
  db.close();
  resolve(result) //   returns result;


       });
     });
  })
 }

Это не возвращает то, что мне нужно:

      var foundForm = await getDocument(query) //Returns 'pending'


    async function getDocument(query){

      MongoClient.connect  (url, async function(err, db) {
        if (err) throw err;
    console.log(query)
        db.collection("users").find(query).toArray(function(err,                            result) {
    if (err) {
    console.log(err)
    throw err;
  }
  console.log(result);
    db.close();

   return result;
     });

     })

}

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Поскольку ваш код getDocument должен ожидать асинхронную операцию, которая не обеспечивает интерфейс Promise, getDocument не должна быть функцией async, поскольку вам нужно создать обещание вручную.(И обратный вызов, который вы даете функции, не сфокусированной на обещаниях, почти никогда не должен быть async функцией.)

function getDocument(query){
    return new Promise((resolve,reject) =>{
        MongoClient.connect(url, function(err, db) {
            if (err) {
                // Reject, don't throw
                reject(err);
                return;
            }
            console.log(query);
            db.collection("users").find(query).toArray(function(err, result) {
                if (err) {
                    // Reject, don't throw
                    reject(err);
                    return;
                }
                console.log(result);
                db.close();
                resolve(result);
            });
        });
    });
}

В качестве альтернативы используйте версии с поддержкой обещаний MongoClient.connect и db.collection("users").find.MongoDB теперь имеет их в своем JavaScript API (боюсь, у меня нет подробностей).Тогда вы бы использовали async функцию с await, чем-то , как это (согласно этому сообщению в блоге ):

// BE SURE TO DOUBLE-CHECK THE DETAILS
async function getDocument(query){
    const db = await MongoClient.connect(url);
    const await result = db.collection("users").find(query).toArray();
    console.log(result);
    await db.close(); // No idea whether you need `await` here or not
    return result;
}
0 голосов
/ 03 июля 2019

Короче да. Если вы нацелены на платформу, которая поддерживает es6 async / await и хотите использовать это, то если библиотека предоставляет только api callback-функции, то «завершение» обратного вызова в Promise (ваша первая функция) - это то, как вы этого достигнете. Хотя сначала вы захотите убедиться, что библиотека не предлагает API, основанный на Promise, вы можете просто вернуть Promise из библиотеки и подождать этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...