function job(){
    sequenceB()
    sequenceC()
}

function sequenceB(){
    setTimeout(_ => console.log(`? Timeout at B`), 0);
    Promise.resolve().then(_ => console.log('? Promise at B'));
}

function sequenceC(){
    setTimeout(_ => console.log(`? Timeout at C`), 0);
    Promise.resolve().then(_ => setTimeout(console.log('? Promise at C'), 1000));
}
job();

这里的打印顺序是什么?为什么?我似乎按照以下顺序得到输出:?Promise在B,?Promise在C,?Timeout在B,?Timeout在C

在Chrome(最新版本)和EDGE(最新版本)上进行了测试

推荐答案

当你呼叫job()时,会先呼叫sequenceB(),然后再呼叫sequenceC().当sequenceB()运行时,setTimeout(_ => console.log('? Timeout at B'), 0);将被推送到回调队列,Promise.resolve().then(_ => console.log('? Promise at B'));将被推送到作业(job)队列.则开始执行sequenceC().同样的情况再次发生,setTimeout(_ => console.log('? Timeout at C'), 0);被推送到回调队列,Promise.resolve().then(_ => setTimeout(console.log('? Promise at C'), 1000));被推送到作业(job)队列.

现在,事件循环会问,作业(job)/微任务是空的吗?它不是,所以代码被执行,这是来自sequenceB()函数的promise ,然后它再次判断作业(job)队列,并找到另一个promise .

下一次,它看起来作业(job)/微任务队列是空的,所以它看回调队列,这是您的setTimeout回调,所以它被推送到调用堆栈.一旦执行,事件就会再次查看,并且肯定会有另一个setTimeout回调.这将再次执行,并重复该过程.

话虽如此,但其结果是:

// from the microtask queue
? Promise at B
? Promise at C

// from the callback queue
? Timeout at B
? Timeout at C

Javascript相关问答推荐

试图为每支球队生成类似于2024/25年欧洲足联冠军联赛瑞士系统格式的独特比赛配对

React:未调用useState变量在调试器的事件处理程序中不可用

提交表格后保留Web表格中的收件箱值?

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

构造HTML表单以使用表单数据创建对象数组

你怎么看啦啦队的回应?

如何调用名称在字符串中的实例方法?

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

可更改语言的搜索栏

material UI按钮组样式props 不反射

对路由DOM嵌套路由作出react

JavaScript不重定向配置的PATH

Reaction-SWR-无更新组件

try 将Redux工具包与MUI ToggleButtonGroup组件一起使用时出错

当从其他文件创建类实例时,为什么工作线程不工作?

在传单的图像覆盖中重新着色特定 colored颜色 的所有像素