async/await 中 await微任务与setTimeout中宏任务的执行顺序的问题

问题描述

async中的await后面的微任务是否应该先于async中settimeout中的宏任务先行完成呢?

问题出现的环境背景及自己尝试过哪些方法

实际结果是顺序完成的,为什么不是所有微任务完成后再运行宏任务呢?

相关代码

let fs = require('fs')

function writeFs(path,content){
    return new Promise(function(resolve,reject){
        fs.writeFile(path,content,{flag:"a",encoding:"utf-8"},function(err){
            if(err){
                //console.log("写入内容出错")
                reject(err)
            }else{
                resolve(err)
                console.log(content)
            }
        })
    })
}

async function writeList(){
    await writeFs('lc.html',"<h1>1今天吃烧烤</h1>");
    setTimeout(()=>{console.log('test122222223')},0)
    await writeFs('lc.html',"<h1>2今天吃烧烤</h1>");
    await writeFs('lc.html',"<h1>3今天吃烧烤</h1>");
    await writeFs('lc.html',"<h1>4今天吃烧烤</h1>");
}

writeList()

你期待的结果是什么?实际看到的错误信息又是什么?

实际运行结果:

<h1>1今天吃烧烤</h1>
test122222223
<h1>2今天吃烧烤</h1>
<h1>3今天吃烧烤</h1>
<h1>4今天吃烧烤</h1>

我预期的结果:

<h1>1今天吃烧烤</h1>
<h1>2今天吃烧烤</h1>
<h1>3今天吃烧烤</h1>
<h1>4今天吃烧烤</h1>
test122222223
阅读 2k
2 个回答

等等,Promise.then 注册的回调是微任务,但是 fs.writeFile 不是啊。

你要是在 writeFs 里直接 console.log 然后直接 resolve 那就是你要的效果,即微任务比 setTimeout 宏任务优先处理。

await writeFs('lc.html',"<h1>1今天吃烧烤</h1>");
setTimeout(()=>{console.log('test122222223')},0)

==>

writeFs('lc.html',"<h1>1今天吃烧烤</h1>").then(function(result){
    setTimeout(()=>{console.log('test122222223')},0);
    //...其它promise
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题