Async / Await Promise Pending Error

时间:2017-08-10 08:37:49

标签: javascript node.js ecmascript-6 promise async-await

我对处理承诺的错误有点问题。 所以最初我的功能设置如此,一切正常,没问题。

原件:

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);
}

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

重构:

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

  let requests = middleware.requestURI(URL_HIDDEN);
  console.log(requests);
}

我开始在一个单独的文件中执行所有请求处理。

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 }];
};

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

1
Promise { <pending> }
2
3

在重构之后,知道为什么它的打印承诺待定?

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

1 个答案:

答案 0 :(得分:8)

在你的&#34; Refactored&#34;代码 -

let requests = middleware.requestURI(URL_HIDDEN);

没有awaitrequests将是未决承诺 - 所以,您需要

let requests = await middleware.requestURI(URL_HIDDEN);

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

async function foo() {
    return true;
}

称之为

let bar = foo();
// here bar = pending promise of foo()

成为承诺的结果

称之为

let bar = await foo(); 
// here bar == true

等同(但不太接近)
foo().then(bar => {
    // here bar == true
})

async/await可以使Promise已经简化的代码更简单 - 在这个人为的例子中,虽然

不明显