异步函数返回[对象承诺]

时间:2019-04-15 19:56:26

标签: javascript promise

我正在尝试返回一个异步函数,但是我得到的是promise: < { PENDING } >[object Promise]而不是[object Object]

我尝试使用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]
};

如果我从函数中移除asyncawait,然后从db.query案例中提取我的底层controller到它自己的async function中,得到promise: < { PENDING } >,所以我在想这是因为顶层函数没有等待它解决。但是,当我使这些函数异步时,它们将为我的静态数据返回promise。我在将这些嵌套的promise / async函数包起来时遇到了麻烦。

2 个答案:

答案 0 :(得分:3)

您不能使异步代码同步。

通过await关键字,您可以编写看起来像同步但实际上是异步的代码。

您只能在await函数内部使用async

要使await正常工作,所有 async函数都应返回承诺。这些承诺被确定为函数的返回值。

简而言之:您具有正常和预期的行为,并且不能阻止async函数返回诺言。

答案 1 :(得分:0)

我通过在顶层getNext()中又添加一个等待来解决了这个问题

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

位于异步router.post调用中。因此答案是:确保所有功能一直到顶部都是异步的,以便彼此等待。