Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
680 views
in Technique[技术] by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...