Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归承诺链_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 递归承诺链

Javascript 递归承诺链,javascript,node.js,promise,Javascript,Node.js,Promise,我目前正在做一个项目,使用一些微服务,其中一个必须反复做同样的事情 代码如下所示: refresh: function(){ return somePromise .then(doA) .then(doB) .then(doC) .catch(error) } 因此,当前另一个函数使用setInterval每秒调用这个“刷新”函数 问题是,由于在refresh方法中这些调用的异步性质,出现了一些错误 我更改了代码,在最后一个“.then”语句中再次递归调用“ref

我目前正在做一个项目,使用一些微服务,其中一个必须反复做同样的事情

代码如下所示:

refresh: function(){
   return somePromise
   .then(doA)
   .then(doB)
   .then(doC)
   .catch(error)
}
因此,当前另一个函数使用setInterval每秒调用这个“刷新”函数

问题是,由于在refresh方法中这些调用的异步性质,出现了一些错误

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

refresh: function(){
   return somePromise
   .then(doA)
   .then(doB)
   .then(doC)
   .then(refresh)
}
现在,这些错误似乎消失了,一切都很正常。 我的问题是: 这是一种好的做法吗?在最后一个“.then”语句中递归调用“refresh”方法是否存在内存问题

这是一种好的做法吗

如果您只想在每次完成时重复,并确保下一次迭代不会在前一次迭代完成之前开始,那么这是一个非常好的实践(比
setInterval()
好得多)。如果任何地方出现拒绝,循环都会停止,因此您可能希望使用
.catch()
编码应该发生的事情

在最后一个“.then”语句中递归调用“refresh”方法是否存在内存问题

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

有关循环期间内存消耗的更多讨论,请参阅


仅供参考,这必须是伪代码,因为定义为属性
refresh:function(){}
的函数不能直接用
调用。然后(refresh)
。所以,我假设您在实际代码中正确地做到了这一点

这是一种好的做法吗

如果您只想在每次完成时重复,并确保下一次迭代不会在前一次迭代完成之前开始,那么这是一个非常好的实践(比
setInterval()
好得多)。如果任何地方出现拒绝,循环都会停止,因此您可能希望使用
.catch()
编码应该发生的事情

在最后一个“.then”语句中递归调用“refresh”方法是否存在内存问题

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

有关循环期间内存消耗的更多讨论,请参阅



仅供参考,这必须是伪代码,因为定义为属性
refresh:function(){}
的函数不能直接用
调用。然后(refresh)
。因此,我假设您在实际代码中正确地做到了这一点。

可能重复的@TomŠabanov的可能重复-这是否回答了您的问题?如果是,请通过单击答案左侧的复选标记向社区指出。这也将为您在这里遵循正确的程序赢得一些声誉积分。如果没有,那么请指出哪些问题尚未得到回答。@TomŠabanov-这是否回答了您的问题?如果是,请通过单击答案左侧的复选标记向社区指出。这也将为您在这里遵循正确的程序赢得一些声誉积分。如果没有,请说明尚未回答的问题。