async/await永远returns承诺

async/await always returns promise

我正在尝试 async/await 功能。我有这样的代码模仿一个请求:

const getJSON = async () => {
  const request = () => new Promise((resolve, reject) => (
    setTimeout(() => resolve({ foo: 'bar'}), 2000)
  ));

  const json = await request();
  return json;
}

当我这样使用代码时

console.log(getJSON()); // returns Promise

它returns一个承诺

但是当我调用这行代码时

getJSON().then(json => console.log(json)); // prints { foo: 'bar' }

它按预期打印 json

是否可以只使用像 console.log(getJSON()) 这样的代码?我不明白什么?

每个 async 函数 return 都是一个 Promise 对象await 语句对 Promise 进行操作,等待 Promise resolvereject

所以不,你不能直接对异步函数的结果执行 console.log,即使你使用 await。使用 await 将使您的函数等待,然后 return 一个 Promise 立即解析,但它不会为您打开 Promise 。您仍然需要使用 await.then() 解包由 async 函数编辑的 Promise return。

当您使用 .then() 而不是直接 console.logging 时,.then() 方法使 Promise 的结果对您可用。但是您无法从 Promise 之外获得 Promise 的结果。这是使用 Promises 模型的一部分。

Return value of an async function will always be an AsyncFunction Object,调用时会 return 一个 Promise。您无法更改 return 类型。 async/await 的要点是在异步函数内轻松等待其他异步进程完成。

async 定义的函数总是 return 是 Promise。如果您 return 任何其他不是 Promise 的值,它将隐式包装在 Promise 中。 语句 const json = await request(); 展开 [=11] =] return由 request() 编辑为普通对象 { foo: 'bar' }。然后在从 getJSON 编辑 return 之前将其包装在 Promise 中,因此当您调用 getJSON() 时最终得到的是 Promise。因此,要解包它,您可以像之前那样调用 getJSON().then() 或调用 await getJSON() 来获取已解析的值。

const getResOrErr = () => {
  const callAsyncCodeHere = async () => {
  const request = () =>
      new Promise((resolve, reject) =>
        setTimeout(() => resolve({ foo: "bar" }), 2000)
      );

    const json = await request();
    return json;
  };
  return callAsyncCodeHere()
   .then(console.log)
   .catch(console.log);
};

getResOrErr();

试试这个。您可以在主函数中创建一个函数,然后将承诺代码放入该函数中。在那里调用它,当你得到响应或错误时 return 它。