Асинхронная функция возвращает [обещание объекта] - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь вернуть асинхронную функцию, но вместо [object Object]

я получаю либо promise: < { PENDING } >, либо [object Promise]. Я пытался вернуть значение с помощью Promise.resolve(value), Promise.resolve().then(return value),return new Promise((resolve, reject) => {resolve(value)}

от верхнего уровня до нижнего уровня мой код выглядит следующим образом:

//Top-Level
const getNext = require('getNext');
const next = getNext({
  page,
  value,
  name,
  id,
});


//getNext
const controllerMap = {
  intro: introController
};
async function getNext({ page, value, name, id}) {
  const controller = controllerMap[name];
  return await controller({
    page,
    value,
    name,
    id
  });
}

// Controller
async function introController({ page, value, id }) {
  switch(page)
    case 10:
      // Do something async ie:
      await db.query
    default: return intro[page]
};

Если я снимаю async и await с функций и извлекаю свой низкий уровень db.query из дела controller в его собственное async function Я просто получил promise: < { PENDING } >, так что я думаю, что это потому, что функции верхнего уровня не ждут его разрешения.Однако, когда я делаю эти функции асинхронными, они возвращают обещания для моих статических данных.У меня проблемы с наложением головы на эти вложенные обещания / асинхронные функции.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2019

Асинхронный код нельзя сделать синхронным.

Ключевое слово await позволяет писать код, который выглядит синхронным, но действительно асинхронным.

Вы можете использовать await только внутри функции, которая async.

Чтобы заставить await работать, функции all async возвращают обещания. Эти обещания разрешают быть возвращаемым значением функции.

Короче говоря: у вас нормальное и ожидаемое поведение, и вы не можете помешать функции async вернуть обещание.

0 голосов
/ 16 апреля 2019

Я решил это, добавив ожидание на верхний уровень getNext() aka

const next = await getNext({
  page,
  value,
  name,
  id,
});

, который находится внутри асинхронного вызова router.post.Поэтому ответ таков: убедитесь, что все функции асинхронны до самого верха, чтобы они ожидали друг друга.

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