考虑以下代码:
function foo() {
console.log('foo');
new Promise(
function(resolve, reject) {
setTimeout(function() {
resolve('RESOLVING');
}, 5000);
}
)
.then(
function(value) {
console.log(value);
}
);
}
foo();
我试图正确理解这里发生的事情:
new Promise 时,“executer function”直接运行,当 setTimeout 被调用时,安排一个操作将新条目添加到“事件队列” (5 秒后)then 一个添加到“作业队列”的操作,所以对传递函数的调用(记录到控制台)被安排在 Promise<> 已解决setTimeout 回调被执行时(在事件循环的某个时刻),Promise 被解析并且基于第 2 点, 的函数参数>then 调用被添加到“作业队列”并随后执行。请注意,我说 [a "job queue"] 是因为有些事情我不确定;哪个“工作队列是它?”。按照我的理解,“作业队列”链接到“事件队列”上的条目。那会是上面例子中的 setTimeout 条目吗?
假设在添加 setTimeout 的回调之前(和之后)没有其他事件被添加到“事件队列”,那么主代码的条目(对 foo 的调用)是否已经(通常) 到那时已经消失(运行完成),因此除了 setTimeout 之外没有其他条目用于 then 的“作业队列”条目被链接到?
最佳答案
- on executing
new Promisethe "executer function" is run directly and whensetTimeoutis called, an operation to add a new entry to the "event queue" is scheduled (for 5 seconds later)
是的。更具体地说,调用 setTimeout 使用浏览器的定时器机制安排一个定时器;大约五秒钟后,计时器机制将一个作业添加到主作业队列,它将调用您的回调。
- because of the call to
thenan operation to add to a "job queue" a call to the passed function (which logs to the console) is organised to happen after thePromiseis resolved
没错。 then(使用单个参数)向 promise 添加一个履行处理程序(并创建它返回的另一个 promise)。当 promise 解决时,调用处理程序的作业将添加到作业队列(但它是一个不同的作业队列)。
- when the
setTimeoutcallback is executed (on some tick of the event loop), thePromiseis resolved and based on point 2, the function argument to thethencall is added to a "job queue" and subsequently executed.
是的,但它不是同一个作业队列。 :-)
主要的作业队列是事件处理程序和计时器回调之类的地方。主事件循环从队列中选择一个作业,运行它直到完成,然后选择下一个作业,等等,如果没有要运行的作业则空闲。
一旦一个作业运行完成,另一个循环开始运行,它负责运行在该主要作业期间安排的任何待定 promise 作业。
在JavaScript规范中,主作业队列称为ScriptJobs,promise回调作业队列为PromiseJobs。在 ScriptJob 结束时,在下一个 ScriptJob 之前执行所有已排队的 PromiseJob。 (在 HTML 规范中,它们的名称是“task”[或“macrotask”] 和“microtask”。)
是的,这确实意味着如果作业 A 和作业 B 都在排队,然后作业 A 被选中并安排一个 promise 回调,那么 promise 回调将在作业 B 运行之前运行,即使作业 B 先排队(在主队列中)。
Notice I say [a "job queue"] because there is something I am not sure about; which "job queue is it?"
希望我在上面涵盖了这一点。基本上:
requestAnimationFrame 回调排队到 ScriptJobs 队列(主要队列);它们是“宏任务”(或简称为“任务”)。The way I understand it, a "job queue" is linked to an entry on the "event queue".
这些只是同一事物的不同名称。 JavaScript 规范使用术语“作业”和“作业队列”。 HTML 规范使用“任务”、“任务队列”和“事件循环”。事件循环是从 ScriptJobs 队列中获取作业的。
So would that be the
setTimeoutentry in above example?
当计时器触发时,作业会在 ScriptJobs 队列中安排。
Assuming no other events are added to the "event queue" before (and after)
setTimeout's callback is added, wouldn't the entry for the main code (the call to foo) have been (usually) gone (run to completion) by that time and thus there would be no other entry thansetTimeout's for thethen's "job queue" entry to be linked to?
基本上是的。让我们把它跑下来:
foo 并调用了它。foo 中,您执行 console.log,然后创建 promise 。then 将履行处理程序添加到 promise 中。console.log更多探索:
关于javascript promises、事件循环和作业队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55676922/
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我是Ruby的新手,有些闭包逻辑让我感到困惑。考虑这段代码:array=[]foriin(1..5)array[5,5,5,5,5]这对我来说很有意义,因为i被绑定(bind)在循环之外,所以每次循环都会捕获相同的变量。使用每个block可以解决这个问题对我来说也很有意义:array=[](1..5).each{|i|array[1,2,3,4,5]...因为现在每次通过时都单独声明i。但现在我迷路了:为什么我不能通过引入一个中间变量来修复它?array=[]foriin1..5j=iarray[5,5,5,5,5]因为j每次循环都是新的,我认为每次循环都会捕获不同的变量。例如,这绝对
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果