异步功能完成后,我可以回到同步代码吗?

时间:2019-07-31 18:16:08

标签: javascript node.js async-await

一个异步函数的例子:

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早被记录。是的,我可以进一步编写异步构造以继续进行操作。但这至少会使我复杂化,并使代码的可读性降低。那么,有没有办法在执行异步部分之后恢复到我上面提到的普通同步代码?

1 个答案:

答案 0 :(得分:0)

为了完成所需的排序,您将需要使用其他异步构造。这些可能会变得非常复杂,但是您有两种选择:

  1. 链式承诺:

    您正在等待Promise返回的getJSONAsync进行解析,然后再通过调用方法1打印Promise#then,该方法还会返回另一个Promise可以用来做进一步的测序。看起来像这样:

    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();
    
相关问题