首页 > 解决方案 > 异步函数完成后我可以返回同步代码吗?

问题描述

一个异步函数的例子:

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 更早记录。是的,我可以进一步编写异步构造来继续流程。但这会使代码复杂化并使其可读性降低,至少对我来说是这样。那么有没有办法在执行异步部分之后恢复正常的同步代码,就像我上面提到的那样?

标签: javascriptnode.jsasync-await

解决方案


为了完成您正在寻找的排序,您将需要使用额外的异步构造。这些可能会变得非常复杂,但您有几个选择:

  1. 链承诺:

    您正在等待Promise返回的 by以在通过调用方法getJSONAsync打印之前解析,该方法还返回另一个可用于进一步排序的方法。看起来像这样:1Promise#thenPromise

    getJSONAsync().then((res) => {
      fs.writeFileSync(`page.html`, res)
      console.log(1)
    }).then(() => {
      console.log(2)
    })
    
  2. async用另一个函数包装:

    或者,您可以使用异步函数包装整个事物。如果你已经在一个异步函数中,你不需要做任何包装,但是为了使用await你需要引入另一个异步函数,然后你可以调用它。

    async function getAndWriteJSON() {
      const res = await getJSONAsync();
      fs.writeFileSync(`page.html`, res)
      console.log(1);
      console.log(2);
    }
    getAndWriteJSON();
    

推荐阅读