我的许多朋友,他们在他们的图书馆中使用了一些延迟/承诺对象,经常告诉我,在自己的实现中使用计时器是一种邪恶。
它与A +不对应:https://github.com/promises-aplus/promises-spec
而jQuery和其他许多图书馆都没有使用计时器。所以我试图在jQuery源代码中找到任何计时器,这可能与promises实现有关,但没有成功:
https://github.com/jquery/jquery/blob/master/src/deferred.js
全部,对,但我在A +说明中发现了一些注释,这让我对使用计时器感到困惑:
在Notes
文章:
此处"平台代码"意味着引擎,环境和承诺 实施代码。在实践中,这个要求确保了这一点 在事件发生后,onFulfilled和onRejected异步执行 循环转入然后调用,并使用新堆栈。这可以 使用"宏任务"机制,如 setTimeout或 setImmediate ,或者使用"微任务"机制如 MutationObserver或process.nextTick。自承诺实施以来 被认为是平台代码,它本身可能包含任务调度 排队或"蹦床"在其中调用处理程序。
所以,我知道A +对定时器的使用没有严格的规定或做过吗?
帮助我,我很困惑。
答案 0 :(得分:3)
您使用setTimeout
和#34;设置定时器"会让您感到困惑。 - Promises / A +实现通常使用setTimeout
来保证处理函数的异步执行,而不是在一段时间内延迟执行。
Promises / A +保证异步调用已完成和被拒绝的方法,无论何时履行承诺。保证浏览器JS环境中异步执行的一种方法是将函数调用包装在setTimeout
中,超时为零(默认值)。
jQuery不保证asyc执行已完成/拒绝的回调(a major design flaw),因此不需要异步包装调用。
答案 1 :(得分:1)
在应用程序中使用通常的计时器是一种不好的做法(除了计划任务之外)。
您无法确定某项操作需要多长时间。所以你最终做了三件事之一:
我不确定规格和内容。但是在一般情况下使用计时器和延迟是一个坏主意。