Как использовать Promises.all и async / await - PullRequest
0 голосов
/ 03 ноября 2018

Я использую Botpress для работы над этим, но я делаю фундаментальную ошибку Javascript, потому что я пытаюсь объединить Promises и Await / Async. Любая помощь о том, как это исправить, была бы удивительной

Это мой код

const knex = await bp.db.get();
const userIds = await knex('_students').distinct('id').pluck('id');
return Promise.all(
  userIds.map((userId) => {
     return await bp.dialogEngine.jumpTo(userId, 'question.flow.json')
    }
  )
);

Это ошибка, которую я получаю:

SyntaxError: await is only valid in async function

Как мне заставить код работать с этим ожиданием в операторе return, потому что мне это нужно согласно Botpress API

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

Вам не нужно использовать await здесь:

const knex = await bp.db.get();
const userIds = await knex('_students').distinct('id').pluck('id');
return Promise.all(
  userIds.map((userId) => {
     return bp.dialogEngine.jumpTo(userId, 'question.flow.json')
    }
  )
);

Просто верните массив обещаний, и вы получите разрешенное значение в массиве, разрешенном из Promise.all.

0 голосов
/ 03 ноября 2018

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

const async_await_promise = async function(){
    const knex = await bp.db.get();
    const userIds = await knex('_students').distinct('id').pluck('id');
    return await Promise.all(
         userIds.map((userId) => {
         return await bp.dialogEngine.jumpTo(userId, 'question.flow.json')
    }))
}
async_await_promise ();
0 голосов
/ 03 ноября 2018

Вы можете добавить async следующим образом:

async (userid) => {...}`
^

Однако вы можете использовать Promise непосредственно из jumpTo(...), а затем вернуть Promise.all(...)

const knex = await bp.db.get();
const userIds = await knex('_students').distinct('id').pluck('id');

const promises = userIds.map((userId) => {
  return bp.dialogEngine.jumpTo(userId, 'question.flow.json')
});

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