Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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 在node中实现基于承诺的连续流程的最佳方式是什么?_Javascript_Node.js_Dom Events_Eventemitter - Fatal编程技术网

Javascript 在node中实现基于承诺的连续流程的最佳方式是什么?

Javascript 在node中实现基于承诺的连续流程的最佳方式是什么?,javascript,node.js,dom-events,eventemitter,Javascript,Node.js,Dom Events,Eventemitter,我正在从事一个项目,在这个项目中,我需要创建一个连续的节点流程,该流程反复执行一些基于承诺的任务,而没有结束时间。第一个承诺周期必须在下一个承诺周期开始之前完成。我对实现这一点的最佳方式感到困惑,对于不同的方法是否有利弊 到目前为止,我正在考虑的两个解决方案是: 递归函数: var repeat = function () { MethodThatReturnsAPromise() .then(function () { repeat();

我正在从事一个项目,在这个项目中,我需要创建一个连续的节点流程,该流程反复执行一些基于承诺的任务,而没有结束时间。第一个承诺周期必须在下一个承诺周期开始之前完成。我对实现这一点的最佳方式感到困惑,对于不同的方法是否有利弊

到目前为止,我正在考虑的两个解决方案是:

递归函数:

var repeat = function () {
    MethodThatReturnsAPromise()
        .then(function () {
            repeat();
        });
};

repeat();
使用节点eventemitter

var events = require('events');
var eventEmitter = new events.EventEmitter();

var run = function () {
    MethodThatReturnsAPromise()
        .then(function () {
            eventEmitter.emit('complete');
        });
};

eventEmitter.on('complete', function () {
    run();
});

run();
目前,我倾向于基于事件的方法


这两种方法对node更“正确”或更惯用,或者说根本不重要(我只是痴迷于细节),有什么原因吗?或者有没有第三种更好的实现方法,我不知道(我对node很陌生)?

您的第一种实现可能是最好的实现方法。谢谢您的回复。您认为这种方法更好的地方是什么?因为承诺是对事件发射器的高级别、更清晰的抽象。没有理由使用事件发射器,除非您必须这样做,在这种情况下,我不明白您为什么会这么做。最初我离开了第一个解决方案,因为在与node inspector一起运行时(这样我可以在承诺代码中找到内存泄漏),我发现我无法使用“记录堆分配”功能,可能是因为递归函数从未完成,所以inspector无法进行对象计数。这让我怀疑,拥有一个永远无法完成的函数是一个不确定的解决方案。eventemitter代码不会出现此问题。你不认为使用事件方法是合理的吗?严格来说,它不是一个永远不会完成的函数,如果它是同步的,那么它最终会在某个点上破坏堆栈,但它是异步的,这意味着它实际上不使用堆栈。它更像是一个从未完成的循环,而是作为递归函数编写的。最后,它所做的事情与您的事件发射器实现完全相同。您的第一个实现可能是最好的实现方式。谢谢您的回复。您认为这种方法更好的地方是什么?因为承诺是对事件发射器的高级别、更清晰的抽象。没有理由使用事件发射器,除非您必须这样做,在这种情况下,我不明白您为什么会这么做。最初我离开了第一个解决方案,因为在与node inspector一起运行时(这样我可以在承诺代码中找到内存泄漏),我发现我无法使用“记录堆分配”功能,可能是因为递归函数从未完成,所以inspector无法进行对象计数。这让我怀疑,拥有一个永远无法完成的函数是一个不确定的解决方案。eventemitter代码不会出现此问题。你不认为使用事件方法是合理的吗?严格来说,它不是一个永远不会完成的函数,如果它是同步的,那么它最终会在某个点上破坏堆栈,但它是异步的,这意味着它实际上不使用堆栈。它更像是一个从未完成的循环,而是作为递归函数编写的。归根结底,它所做的工作与您的事件发射器实现完全相同。