2016-11-11 133 views
0

下面的代码工作 - 但是在我将NODEJS从4 ..更新到6.9.1后,它突然抛出一个错误(对于每个调用)......意味着它完美地执行所有递归调用,并且之后告诉我像下面的错误消息的20倍...NodeJS SetImmediate和回调函数

“回调”参数必须是一个函数。

我发现错误 - 每件事情都很好。它是一个递归调用 - filterTrades。我一直这样使用它很长一段时间 - 从来没有问题。该怎么办?我猜这些代码使用不必要的资源来捕捉某些东西(实际上并不需要)?

var id = setImmediate(filterTrades(rows, indexStart, indexEnd, offset)); 
clearImmediate(id); 
+2

'filterTrades'是否返回函数? –

+0

将2个linies放置在函数filterTrades()中。就像我写的 - 它的递归。 – PabloDK

+0

这不相关; 'setImmediate'的参数应该是一个函数,而你正在*调用一个函数,因此有关'filterTrades'返回的问题。 –

回答

0

@DaveNewton是钱 - 你可能想

var id = setImmediate(() => filterTrades(rows, indexStart, indexEnd, offset)); 
clearImmediate(id); 

和ES5方式

var id = setImmediate(function(){ 
    filterTrades(rows, indexStart, indexEnd, offset); 
}) 
clearImmediate(id); 
+0

语法不被识别(通过WebStorm)? – PabloDK

+0

它可能不会更新到皮棉es6 –

+0

@PabloDK \t然后使用标准ES5做同样的事情 –

0

也许你应该

filterTrades(rows, indexStart, indexEnd, offset); 

,并替换此代码没有setImmediate/clearImmediate。

  1. 在以前的Node.js版本中,像你这样的非函数调用setImmediate将不会做任何事情。然后,调用clearImmediate将不会执行任何操作。因此,要重现该行为,只需执行副作用(即调用filterTrades),但删除所有setImmediate/clearImmediate的东西。

  2. 即使在Node.js的当前版本,提出了通过例如代码@斯卡夫的回答无能为力。如果您立即设置并立即清除它,那意味着什么都不会执行。因此,@ skav的版本将完全删除对filterTrades的呼叫;它等同于完全删除代码。

+0

我不同意。代码一如既往的完美。 DOC说:clearImmediate(立即)# 添加在:v0.9.1 立即由setImmediate()返回的立即对象。 取消由setImmediate()创建的立即对象。所以我理解它的方式 - 就像...只是取消了返回对象而不是实际本身...否则我的代码不会运行我猜? – PabloDK

+0

另外...我可以直接看到并调整内存使用setImmediate/clearImmediate在我的代码中的另一个地方...每个循环之间的工作量...它对演出产生了巨大的影响......所以它什么都不做 - 事实根本不是这样。 – PabloDK

+0

和...你怎么能说@斯卡夫的答案不会执行任何事情?它与我的原始代码相同,它确实调用我的代码并执行? – PabloDK