一个异步函数的例子:
async function getJSONA(callback){
let json = await request.get(url, (req, res, html) => {
callback = html
});
return callback;
}
getJSONAsync().then((res) => {
fs.writeFileSync(`page.html`, res)
console.log(1)
})
效果很好,最后得到的是“ 1”。现在,让我们说说.then
函数之后,我想编写一个console.log,像这样
getJSONAsync().then((res) => {
fs.writeFileSync(`page.html`, res)
console.log(1)
})
console.log(2)
很明显,2将比1早被记录。是的,我可以进一步编写异步构造以继续进行操作。但这至少会使我复杂化,并使代码的可读性降低。那么,有没有办法在执行异步部分之后恢复到我上面提到的普通同步代码?
答案 0 :(得分:0)
为了完成所需的排序,您将需要使用其他异步构造。这些可能会变得非常复杂,但是您有两种选择:
链式承诺:
您正在等待Promise
返回的getJSONAsync
进行解析,然后再通过调用方法1
打印Promise#then
,该方法还会返回另一个Promise
可以用来做进一步的测序。看起来像这样:
getJSONAsync().then((res) => {
fs.writeFileSync(`page.html`, res)
console.log(1)
}).then(() => {
console.log(2)
})
使用另一个async
函数包装:
或者,您可以使用异步函数包装整个内容。如果您已经在使用异步函数,则无需进行任何包装,但是要使用await
,则需要引入另一个异步函数,然后可以调用它。
async function getAndWriteJSON() {
const res = await getJSONAsync();
fs.writeFileSync(`page.html`, res)
console.log(1);
console.log(2);
}
getAndWriteJSON();