- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
以下引述是我理解微任务队列处理的主要引用资料:
Microtasks (which promises use) are processed when the JS stack empties.
这对我来说没有意义。
One go-around of the event loop will have exactly one task being processed from the macrotask queue (this queue is simply called the task queue in the WHATWG specification). After this macrotask has finished, all available microtasks will be processed, namely within the same go-around cycle.
现在,关于以下代码段中的第 9 行 (**):
通过使用调试器逐步执行此代码段,当处理/执行这些 .then( callback )
微任务时,执行堆栈不会显示为空。
像 f2()
这样的常规函数是否被视为任务(又名宏任务)? (当它返回时,它是一个事件循环 nextTick()
并且微任务队列被处理)
为什么当 JS 栈不为空时微任务会执行?
function f2() {
let x = new Promise( (resolve, reject) => { resolve( () => {console.log('howdy')} ) })
return x
}
async function f1(){
let y = Promise.resolve().then(() => { console.log('yo1')})
console.log('yo2')
let r2awaited = await f2() //** 'yo0' and 'yo1' log when the interpreter hits this line.
return r2awaited
}
async function start(){
let y = Promise.resolve().then(() => { console.log('yo0')})
let xx = await f1()
console.log('main call return:')
console.log(xx)
}
start()
编辑:另一个奇怪的发现 - 当您在第 17 行 console.log(xx)
之后添加 xx()
时,堆栈完全清除 在执行微任务之前。
微任务队列处理之前的调用栈1:
然后是紧接着的下一步。
在这两个步骤之间,处理了微任务队列。
调用堆栈是否在这些步骤之间清除了[幕后]^?
然后await [expression]
之后的代码是否根据所需的词法环境创建了一个新的调用栈?
编辑:在发布这篇文章时,我并不知道 chrome 调试器调用堆栈中 -----(async)----- 行下方的所有内容都是“假堆栈”的一部分。
此“假堆栈”以与同步调试一致的方式呈现用于异步调试。
只有此 -----(async)----- 行之上的元素才是真正的主线程调用堆栈的一部分。
最佳答案
"Microtasks (which promises use) are processed when the JS stack empties." -Jake Archibald (doesn't make sense to me)
“调用堆栈”是当前正在执行的事物的列表:
function foo() {
debugger;
console.log('foo');
}
function bar() {
foo();
debugger;
}
bar();
当我们命中第一个调试器语句时,脚本仍在执行,bar
也是,foo
也是。由于存在父子关系,堆栈为 script > bar > foo
。当我们点击第二个调试器语句时,foo
已完成执行,因此它不再位于堆栈中。堆栈是 script > bar
。
当堆栈变空时,微任务队列会一直处理到它为空。
"One go-around of the event loop will have exactly one task being processed from the macrotask queue (this queue is simply called the task queue in the WHATWG specification). After this macrotask has finished, all available microtasks will be processed, namely within the same go-around cycle." - stackoverflow
编辑:我一直把上面的“macrotask”读成“microtask”。浏览器中实际上并没有宏任务队列这样的东西,它只是一个任务队列。
虽然在处理任务后确实有一个微任务处理点,但它只是真正在那里处理规范,将任务排队到队列微任务,而不需要先调用JS。大多数时候,微任务队列在 JS 堆栈清空时清空。
From stepping through this snippet w/ debugger, the execution stack does not appear empty when these .then( callback ) microtasks are processed/executed.
当执行回调时,堆栈永远不会为空,因为回调本身将在堆栈上。但是,如果这是堆栈上唯一的东西,您可以假设在调用此回调之前堆栈为空。
Chrome 的开发工具试图帮助维护“异步”堆栈,但这不是真正的堆栈。真正的堆栈是第一个“异步”行之前的所有内容。
Are regular functions like f2() considered a task
作为任务或微任务不是函数的属性。可以在任务、微任务和事件循环的其他部分(例如渲染)中调用相同的函数。例如:
function foo() {}
// Here, I'll call foo() as part of the current task:
foo();
// Here, I'll let the browser call foo() in a future task:
setTimeout(foo);
// Here, I'll let the browser call foo() in a microtask:
Promise.resolve().then(foo);
// Here, I'll let the browser call foo() as part of the render steps:
requestAnimationFrame(foo);
在您的示例中,f2
未在微任务中调用。有点像这样:
function three() {}
function two() {}
async function one() {
await two();
three();
}
one();
此处,one()
在执行脚本的任务中被调用。 one()
同步调用 two()
,因此它作为同一任务的一部分运行。然后我们等待
调用two()
的结果。因为我们 await
,函数的其余部分在微任务中运行。 three()
被调用,所以它在同一个微任务中运行。
关于javascript - 为什么带有 'await'的这行代码会触发微任务队列处理呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56851983/
我遇到一种情况,我需要从某个主题读取(正在进行的)消息并将它们放入另一个 Queue 中。我怀疑我是否需要 jms Queue 或者我可以对内存中的 java Queue 感到满意。我将通过同一 jv
队列也是一种操作受限的线性数据结构,与栈很相似。 01、定义 栈的操作受限表现为只允许在队列的一端进行元素插入操作,在队列的另一端只允许删除操作。这一特性可以总结为先进先出(First In
队列的定义 队列(Queue):先进先出的线性表 队列是仅在队尾进行插入和队头进行删除操作的线性表 队头(front):线性表的表头端,即可删除端 队尾(rear):线性表的表尾端,即可插入端 由于这
Redis专题-队列 首先,想一想 Redis 适合做消息队列吗? 1、消息队列的消息存取需求是什么?redis中的解决方案是什么? 无非就是下面这几点: 0、数据可以顺序读
0. 学习目标 栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作的子集,但从数据类型的角度来讲,它们与线性表又有着巨大的不
我想在 redis + Flask 和 Python 中实现一个队列。我已经用 RQ 实现了这样的查询,如果你有 Flask 应用程序和任务在同一台服务器上工作,它就可以正常工作。我想知道是否有可能创
我正在使用 Laravel 5.1,我有一个大约需要 2 分钟来处理的任务,这个任务特别是生成报告...... 现在,很明显,我不能让用户在我接受用户输入的同一页面上等待 2 分钟,而是我应该在后台处
我正在使用 Azure 队列,并且有多个不同的进程从队列中读取数据。 我的系统的构建方式假设每条消息只读取一次。 这个Microsoft article声称 Azure 队列具有至少一次传送保证,这可
我正在创建一个Thread::Queue元素数组。 我这样做是这样的: for (my $i=0; $i new; } 但是,当我在每个队列中填充这样的元素时 $queues[$index]->enq
我试图了解如何将我的 Mercurial 补丁推送到远程存储库(例如 bitbucket.org),而不必先应用它们(实际上提交它们)。我的动机是在最终完成之前首先对我的工作进行远程备份,并且能够与其
我的本地计算机上有一个 Mercurial 队列补丁,我需要与同事共享该补丁,但我不想将其提交到上游存储库。有没有一种简单的方法可以打包该补丁并与他分享? 最佳答案 mq 将补丁作为不带扩展名的文
Java 中是否有任何类提供与 Queue 相同的功能,但有返回对象的选项,并且不要删除它,只需将其设置在集合末尾? 最佳答案 Queue不直接提供这样的方法。但是,您可以使用 poll 和 add
我在Windows上使用Tortoise svn客户端,我需要能够一次提交来自不同子文件夹的更改文件-一次提交。像在提交之前将文件添加到队列中之类的?我该怎么做? Windows上是否还有另一个svn
好吧,我正在尝试对我的 DSAQueue 类进行单元测试,它显示我的 isEmpty()、isFull() 和 dequeue() 方法失败。 以下是我的 DSAQueue 代码。我认为我的 Dequ
我想尽量减少对传入请求的数据库查询。它目前需要写入 6 个不同的表。在返回响应之前不需要完成处理。因此,我考虑了 laravel 队列,但我想知道我是否也可以摆脱写入队列/作业表所需的单独查询。我可以
我正在学习队列数据结构。我想用链表创建队列。我想编程输出:10 20程序输出:队列为空-1 队列为空-1 我哪里出错了? 代码如下: class Node { int x; Node next
“当工作人员有空时,他们会根据主题的优先级列表从等待请求池中进行选择。在时间 t 到达的所有请求都可以在时间 t 进行分配。如果两名工作人员同时有空,则安排优先权分配给最近的工作最早安排的人。如果仍然
我正在开发一个巨大的应用程序,它使用一些子菜单、模式窗口、提示等。 现在,我想知道在此类应用程序中处理 Esc 和单击外部事件的正确方法。 $(document).keyup(function(e)
所以 如果我有一个队列 a --> b --> NULL; 当我使用函数时 void duplicate(QueueNodePtr pHead, QueueNodePtr *pTail) 它会给 a
我正在尝试为键盘输入实现 FIFO 队列,但似乎无法让它工作。我可以让键盘输入显示在液晶显示屏上,但这就是我能做的。我认为代码应该读取键盘输入并将其插入队列,然后弹出键盘输入并将值读取到液晶屏幕上。有
我是一名优秀的程序员,十分优秀!