执行之前,异步承诺在JavaScript中存储在哪里?

时间:2018-12-24 22:50:35

标签: javascript asynchronous callback promise event-handling

我已经使用JavaScript几年了,最近对高级JavaScript概念进行了大量研究。我了解到,函数回调存储在通常称为事件队列或消息队列的队列中,而这正是JavaScript可以异步操作的原因。

我从许多来源获悉,promise在事件队列上的回调之前执行。我的个人实验也证实了这种行为。但是,两者似乎都被推到了相同的队列中。如果promise与其他所有回调共享相同的队列,如何首先执行promise?

从逻辑上讲,我假设将诺言推送到比事件队列中的回调具有更高优先级的其他队列中,但是我找不到任何支持该消息的来源。

我了解到,所有浏览器对事件队列的处理方式都不相同,并且不同的环境将观察到不同的行为。但是,我一定会丢失一些东西。

1 个答案:

答案 0 :(得分:1)

这是实现定义。 ECMAScript(JavaScript)规范仅要求const TabFormData = { EN: { mail: [ { tabLabel: 'Email Our Team', tabIcon: 'fa fa-envelope', }, { label: 'First Name', type: 'text', name: 'name', required: true, hint: 'Please, provide your Name.', }, { label: 'Last Name', type: 'text', name: 'surname', required: true, hint: 'Please, provide your Last Name.', }, { label: 'Email Address', type: 'email', name: 'email', required: true, hint: 'Please, provide a valid email.', }, { label: 'Your Message', type: 'textarea', required: true, name: 'message', hint: 'Write us a message.', rows: 20, cols: 50, }, { label: 'About You', required: true, select: [ 'Home use', 'Business use', 'Freelance, professional', ], }, ], quote: [ { tabLabel: 'Request a Quote', tabIcon: 'fa fa-file-invoice-dollar', }, { label: 'First Name', type: 'text', name: 'name', required: true, hint: 'Please, provide your Name.', }, { label: 'Last Name', type: 'text', name: 'surname', required: true, hint: 'Please, provide your Last Name.', }, { label: 'Phone Number', type: 'number', name: 'telephone', required: true, hint: 'Please, provide a valid number', }, { label: 'Email Address', type: 'email', name: 'email', required: false, hint: 'Please, provide a valid email.', }, { label: 'Your Message', type: 'textarea', required: false, name: 'message', hint: 'Write us a message.', rows: 20, cols: 50, }, { label: 'About You', required: true, select: [ 'Home use', 'Business use', 'Freelance, professional', ], }, ], call: [ { tabLabel: 'Call Me Back', tabIcon: 'fa fa-phone', }, { label: 'First Name', type: 'text', name: 'name', required: true, hint: 'Please, provide your Name.', }, { label: 'Last Name', type: 'text', name: 'surname', required: true, hint: 'Please, provide your Last Name.', }, { label: 'Phone Number', type: 'number', name: 'telephone', required: true, hint: 'Please, provide a valid number', }, { label: 'About You', required: true, select: [ 'Home use', 'Business use', 'Freelance, professional', ], }, ], }, IT: { }, };回调(并等待)的作业(EnqueueJob s)在同步JavaScript代码之后并按顺序执行。

它之外发生的所有事情(Node中带有I / O回调或浏览器DOM API的“事件循环”)均由平台控制。

即:  -承诺回调调度是JavaScript和ECMAScript规范的一部分。  -其他I / O(例如计时器,文件访问,DOM用户交互事件,网络访问)由主机平台而不是JavaScript决定。可以是Node.js或浏览器DOM API。

实现定义是一个队列还是两个队列。

我将选择一种实现(Node.js)。在Node.js(和Chrome)中,它们存储在两个不同的队列中。

Promise回调通过V8的Isolate(执行环境)的then方法“运行”。这发生在next_tick.js

RunMicrotasks

这将调用V8的微任务队列。另一方面,回调是通过node.cc中的libuv运行的。

有两个队列(libuv和V8),而V8(微任务队列)有机会在libuv的每两个项目之间运行。