Async/Await Promise Pending Error

Phi*_*lip 3 javascript node.js promise async-await ecmascript-6

处理promises的错误让我有点问题.所以最初我的功能设置如此,一切正常,没问题.

原版的:

const request = require("request-promise");
async () => {
  const URL_HIDDEN = "...";

  let info = await request(URL_HIDDEN);
  info = JSON.parse(info).response.players[0];

  let playtime = await request(URL_HIDDEN);
  playtime = JSON.parse(playtime).response.games;

  console.log(info);
  console.log(playtime);
}
Run Code Online (Sandbox Code Playgroud)

这是一个缩短版本,但基本上我只是从Steam API请求信息.两个变量都打印出来,所有数据都没有问题,但是一旦我在下面的重构中做了改变.

重构:

const middleware = require("../middleware");
async () => {
  const URL_HIDDEN = "...";

  let requests = middleware.requestURI(URL_HIDDEN);
  console.log(requests);
}
Run Code Online (Sandbox Code Playgroud)

我开始在单独的文件中的单独函数中处理所有请求.

const request = require("request-promise");
middlewareObj.requestURI = async (URL_HIDDEN) => {
  console.log("1");
  let info = await request(URL_HIDDEN);
  info = JSON.parse(info).response.players[0];

  console.log("2");

  let playtime = await request(URL_HIDDEN);
  playtime = JSON.parse(playtime).response.games;

  console.log("3");

  return [{ info }, { playtime }];
};
Run Code Online (Sandbox Code Playgroud)

一旦我得到了所有变量,我想要返回一个数组.但是,一旦执行,我就会将其打印到控制台.

1
Promise { <pending> }
2
3
Run Code Online (Sandbox Code Playgroud)

知道为什么一旦我重构它就会打印出承诺吗?

在原版中,它打印出一切都很好

Jar*_*a X 10

在您的"重构"代码中 -

let requests = middleware.requestURI(URL_HIDDEN);
Run Code Online (Sandbox Code Playgroud)

没有await,requests将是一个未决的承诺 - 所以,你需要

let requests = await middleware.requestURI(URL_HIDDEN);
Run Code Online (Sandbox Code Playgroud)

为了扩展这一点.标记的任何函数async都将返回Promise.

async function foo() {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

称之为

let bar = foo();
// here bar = pending promise of foo()
Run Code Online (Sandbox Code Playgroud)

酒吧的结果是承诺

称之为

let bar = await foo(); 
// here bar == true
Run Code Online (Sandbox Code Playgroud)

有点等同于(但无处可比)

foo().then(bar => {
    // here bar == true
})
Run Code Online (Sandbox Code Playgroud)

async/await 可以使Promise已经简化的代码更简单 - 在这个人为的例子中,它并不明显