nodejs setTimeout和递归调用context(this / self)

时间:2018-01-26 13:36:57

标签: node.js recursion promise stream settimeout

我正在处理一个项目,并且在递归函数中遇到了 setTimeout()函数。我对承诺很新,所以我可能也没有正确地实施这部分。

该计划应该:

  1. 为流活动添加一个监听器'可读'
  2. 如果读取特定的定期数据,则向流写入请求
  3. 解决承诺并在其他一些数据(答案)之后删除侦听器 收到
  4. 从Stream向另一个进程发送消息
  5. 通过延迟10secs
  6. 递归调用相同的方法重复

    Bassicly我试图每隔10秒从一个流中进行轮询。

    代码看起来像这样:

        class XYZ {
            myFunction(commands, intervall, i) {
                var self = this;
    
                var promise = new Promise((resolve, reject) => {
                    // I have to write to a Stream and listen for an answer
                    self.dataStream.write(someData, () => {
                        self.dataStream.addListener('readable', handleStuff);
                    });
    
                    // Function that handles incoming data from the Stream
                    var handleStuff = function () {
                        if (self.dataStream == someFormat) {
                            self.dataStream.write(commands[i]);
                        } else {
                            self.dataStream.removeListener('readable', hadleStuff);
                            resolve(self.dataStream.read());
                        }
                    }
                });
    
                // Resolving by sending msg and calling recursivly
                promise.then((message) => {
                    self.send(message);
                    if (i + 1 > resetValue) {
                        setTimeout(() => {
                            self.myFunction(commands, intervall, 0);
                        }, intervall);
                    } else {
                        self.myFunction(commands, intervall, i + 1);
                    }
                });
            }
        };
    

    我称之为:

    var myXYZ = new XYZ();
    myXYZ.myFunction(myCommands, 10000, 0);
    

    现在当我运行初始调用时,它运行正常,并将消息从dataStream发送到另一个进程。但是当调用 setTimeout()函数时,函数会被"卡住"在第一次将数据写入流中并且未解决的承诺都没有被拒绝。 我的猜测是我在我的代码中混淆了上下文(this / self)。遗憾的是没有错误信息,所以我认为我的逻辑是错误的。如果我只是删除 setTimeout()函数,它也可以正常工作。我现在的问题是 setTimeout()如何改变代码运行的上下文?

0 个答案:

没有答案
相关问题