在延期/承诺实施中使用计时器是邪恶的吗?

时间:2014-10-21 13:03:49

标签: javascript asynchronous timer promise deferred

我的许多朋友,他们在他们的图书馆中使用了一些延迟/承诺对象,经常告诉我,在自己的实现中使用计时器是一种邪恶。

它与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 +对定时器的使用没有严格的规定或做过吗?

帮助我,我很困惑。

2 个答案:

答案 0 :(得分:3)

您使用setTimeout和#34;设置定时器"会让您感到困惑。 - Promises / A +实现通常使用setTimeout 来保证处理函数的异步执行,而不是在一段时间内延迟执行。

Promises / A +保证异步调用已完成和被拒绝的方法,无论何时履行承诺。保证浏览器JS环境中异步执行的一种方法是将函数调用包装在setTimeout中,超时为零(默认值)。

jQuery不保证asyc执行已完成/拒绝的回调(a major design flaw),因此不需要异步包装调用。

答案 1 :(得分:1)

在应用程序中使用通常的计时器是一种不好的做法(除了计划任务之外)。

您无法确定某项操作需要多长时间。所以你最终做了三件事之一:

  • 你要么分配的时间不够,在这种情况下,因为你预期会发生的一些事情还没有发生,所以事情就会破裂。
  • 或者你分配了太多时间,在这种情况下,你的申请很慢,没有充分的理由
  • 或者,最糟糕的情况是,您分配足够时间,这会导致您的应用程序有时中断,有时会按预期工作。

我不确定规格和内容。但是在一般情况下使用计时器和延迟是一个坏主意。