Creeper
Creeper
@Ma63d 你给的链接里描述很清晰,microtask跟你说的这些无关。 链接描述,一个event loop的典型步骤: 1. Select the oldest task... 2. Set the event loop's currently running task to the task selected in the previous step. 3. Run: Run the selected...
@keenwon 为了让第2,3步更清晰一点,可以写成下面这样。 ```js // 1 setTimeout(); // 2 var promise = new Promise(executor); // 3 promise.then(callback) // 4 console.log(3) ``` 其中,得到`Promise`的实例promise的时候,`exectuor`作为参数传给`Promise`的构造函数同步执行。所以输出了数字`1`和`2`。 构造函数执行完后,我们得到了`promise`(它是`resolved`)。 调用`promise.then`,`callback`被添加到microtasks的队列中。 `console.log(3)`执行完后,当前执行栈为空,则开始执行microtasks。
补充关于 *同步/异步/阻塞/非阻塞* 的理解。搬迁自已废弃的#15,因为觉得和 `event loop` 强相关,放到一起便于参照。 ### Synchronize / Asynchronize / Block / Non-block 一个从分布式系统角度的理解 *这一段主要来自* **知乎 [怎样理解阻塞非阻塞与同步异步的区别? 严肃的答案](https://www.zhihu.com/question/19732473/answer/20851256)** *,并参照了 stackoverflow 的相关问题。* 同步与异步,阻塞与非阻塞是两组概念,但容易混淆,比如同步不代表阻塞,同步也可以是非阻塞的。 #### 同步与异步 1. 同步和异步关注的是 **消息通信机制 (synchronous communication/...
@szouc 阻塞/非阻塞和单/多线程没有对应关系,同步异步和线程也没有关系。 在Node.js中,JavaScript是单线程的,所以必然不能使用阻塞IO(阻塞就没法实现高并发)。 > Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. 通过libuv,Node.js 在多平台支持了非阻塞IO: 1. Network IO,依赖Linux上的epoll,OSX和BSD类OS上的kqueue,SunOS上的event ports以及Windows上的IOCP等内核事件通知机制。 2. File IO,使用thread pool (线程池,多线程)。
@1msoft 你的意思是对的,可能描述有点问题。 1. tasks 队列的第一个任务取出,开始执行。 2. 执行直到当前 stack 为空,于是去检查 microtasks 队列。 3. 依次执行 mocrotasks 队列的所有任务,直到 mocrotasks 队列为空,转 1 。 如上循环中,注意到第 2 步中执行时可以向 microtasks 队列压入 microtask。 ```js (function test() { //...
@kkshaq 昨天晚上看了下相关代码,有点变化,我今天看完再和你讨论下,谢谢。 先找到 `require('internal/process/next_tick').setup()`,这是初始化 next_tick 功能。 ```js // 调用 c++ 的 SetupNextTick const tickInfo = process._setupNextTick(_tickCallback, _runMicrotasks); // 设置 _runMicrotasks,对应 c++ 的 RunMicrotasks _runMicrotasks = _runMicrotasks.runMicrotasks; ``` 然后找到 c++ 中...
@rubyless 在浏览器的 event loop 中, UI redner 发生在 microtasks 执行完成之后。
@zhanba 基本是这样的。 @lastIndexOf ```js function _tickCallback() { do { // 便利执行当前 nextTickQueue while (tickInfo[kIndex] < tickInfo[kLength]) { ++tickInfo[kIndex]; // ...... _combinedTickCallback(args, callback); // ...... if (kMaxCallbacksPerLoop < tickInfo[kIndex]) tickDone(); }...
@silhouettesia 是的。
@silhouettesia 当然不会。把 Ajax 封装成 promise 形式,只是 API 使用形式的变化,底层仍然基于事件注册和回调。