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已经简化的代码更简单 - 在这个人为的例子中,它并不明显