我对处理承诺的错误有点问题。 所以最初我的功能设置如此,一切正常,没问题。
原件:
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
在重构之后,知道为什么它的打印承诺待定?
在原版中,它打印出一切都很完美
答案 0 :(得分:8)
在你的&#34; Refactored&#34;代码 -
let requests = middleware.requestURI(URL_HIDDEN);
没有await
,requests
将是未决承诺 - 所以,您需要
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已经简化的代码更简单 - 在这个人为的例子中,虽然