递归承诺链

时间:2018-06-08 16:15:26

标签: javascript node.js promise

我目前正在开发一个使用一些微服务的项目,其中一个必须一遍又一遍地做同样的事情。

代码如下所示:

refresh: function(){
   return somePromise
   .then(doA)
   .then(doB)
   .then(doC)
   .catch(error)
}

所以目前另一个函数每秒都用setInterval调用这个“刷新”函数。

问题在于,由于刷新方法中这些调用的异步特性,会出现一些错误。

我更改了代码,在最后一个'.then'语句中以递归方式再次调用'refresh'方法并删除了setInterval。

refresh: function(){
   return somePromise
   .then(doA)
   .then(doB)
   .then(doC)
   .then(refresh)
}

现在这些错误似乎已经消失,一切都很完美。 我的问题是: 这是一个好习惯吗?在最后一个'.then'语句中以递归方式调用“refresh”方法是否存在任何内存问题?

1 个答案:

答案 0 :(得分:2)

  

这是一个好习惯吗?

如果您只是希望它在完成时重复并确保下一次迭代在前一次迭代完成之前没有开始,这是一个非常好的做法(比setInterval()好得多)。如果在任何地方发生拒绝,您的循环就会停止,因此您可能希望对代码.catch()进行编码。

  

调用"刷新"是否存在任何内存问题方法递归地在最后一个'然后'声明?

没有。没有。由于.then()始终是异步调用的,因此堆栈总是会展开,因为你的链中可能有异步操作,所以应该有时间进行正常的垃圾收集。

有关循环期间内存消耗的更多讨论,请参阅Building a promise chain recursively in javascript - memory considerations

仅供参考,这必须是伪代码,因为定义为属性refresh: function() {}的函数不能用.then(refresh)直接调用。所以,我假设你在真实的代码中做得很好。