жду с Promise.все не действует - PullRequest
0 голосов
/ 17 мая 2018

Ниже представлена ​​моя асинхронная функция для чтения значений из БД и записи чего-либо на консоли. Но по какой-то причине этого не происходит.

Итак, я создаю массив обещаний, а затем продолжаю ждать разрешения всех обещаний, поскольку обещания будут считываться из БД. Но await on Promise.all не приостанавливает выполнение кода и не ожидает всех обещаний, чтобы разрешить вместо передачи управление обратно вызывающей функции. Есть ли что-то, что я здесь скучаю?

async function readValuesFromDB(codes) {
  console.log('trying to read values from DB');
  let dbPromises = [];
  for(let code in codes) {
    let refId = 'some_random_reference_id_generated_from_codes[i]';
    dbPromises.push(MyDb.getPromise(refId)); // getPromise() returns a promise that reads from DB
  }
  console.log('waiting for all promises to resolve...');

  // waiting for all promises to finish 
  await Promise.all(dbPromises).then((allPromises) => {
    for(let i in allPromises) {
      console.log('OK..read from DB');
    }
  });
  console.log('all promises resolved');

}

console.log('calling readValuesFromDB()');
readValuesFromDB();
console.log('finished readValuesFromDB()');

Вывод вышеуказанного вызова:

trying to read values from DB
waiting for all promises to resolve...
finished readValuesFromDB
......
......
OK..read from DB
OK..read from DB
OK..read from DB
...
...
all promises resolved

В идеале вывод должен быть ниже (поскольку я ожидаю разрешения всех обещаний, используя await с Promise.all )

trying to read values from DB
waiting for all promises to resolve...
OK..read from DB
OK..read from DB
OK..read from DB
...
...

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

Любая помощь, почему await не действует в этом случае?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Нормальное поведение.

readValuesFromDB работает асинхронно, а не console.log('finished readValuesFromDB()');

Таким образом, консоль анализирует «Закончено» до разрешения readValuesFrom из БД.

Вы можете сделать так:

async function readValuesFromDB(codes) {
      console.log('trying to read values from DB');
      let dbPromises = [];
      for(let code in codes) {
        let refId = 'some_random_reference_id_generated_from_codes[i]';
        dbPromises.push(MyDb.getPromise(refId)); // getPromise() returns a promise that reads from DB
      }
      console.log('waiting for all promises to resolve...');
    
      // waiting for all promises to finish 
      let allPromises = await Promise.all(dbPromises);
  for(let i in allPromises) {
    console.log('OK..read from DB');          
  }  
  console.log('all promises resolved');
      console.log('finished readValuesFromDB()');
    }
    
    console.log('calling readValuesFromDB()');
    readValuesFromDB();

или как это:

async function readValuesFromDB(codes) {
  console.log('trying to read values from DB');
  let dbPromises = [];
  for(let code in codes) {
    let refId = 'some_random_reference_id_generated_from_codes[i]';
    dbPromises.push(MyDb.getPromise(refId)); // getPromise() returns a promise that reads from DB
  }
  console.log('waiting for all promises to resolve...');
  
  // waiting for all promises to finish 
  let allPromises = await Promise.all(dbPromises);
  for(let i in allPromises) {
    console.log('OK..read from DB');          
  }  
  console.log('all promises resolved');
  allPromises = ['a', 'b', 'c']; // Dumb values for example
  return allPromises;
}

console.log('calling readValuesFromDB()');
readValuesFromDB().then(response => {
   console.log('finished readValuesFromDB()');
   console.log(response)
});
0 голосов
/ 17 мая 2018

Вам не хватает ожидающего здесь:

(async function() {
  console.log('calling readValuesFromDB()');
  await readValuesFromDB();
  console.log('finished readValuesFromDB()');
})();
0 голосов
/ 17 мая 2018

Вы должны await позвонить на readValuesFromDB.

console.log('calling readValuesFromDB()');
await readValuesFromDB();
console.log('finished readValuesFromDB()');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...