【问题标题】:Prevent NodeJS from exiting event-loop防止 NodeJS 退出事件循环
【发布时间】:2017-04-14 17:43:20
【问题描述】:

嘿,哈瓦谷歌搜索并尝试了所有方法 - 但似乎没有任何效果,所以现在我要问你们:

如何制作我的 Node 应用程序。从停止退出 - 当我喜欢它继续运行并等待来自 Web Socket 连接的响应时? 如您所见,我在“PreventExit”功能中尝试了不同的东西。我只是想要这个应用程序。继续从 Web 套接字连接接收数据 - 无需关闭/退出。

var Gdax = require('gdax');
var WSemitter = require('../eventemitters/websocket-emitter');

module.exports = {
    initws: function () {
        var WebSocketEmit = new WSemitter();

        test();

        function test() {
            try {
                PreventExit();

                var websocket = new Gdax.WebsocketClient();
                websocket.on('message', function (data) {
                    console.log(data);
                    WebSocketEmit.fakeEvent();
                });
            }
            catch (err) {
                console.log(err);
            }
        }

        function PreventExit(){
            WebSocketEmit.on('fakeEvent', function () {
                console.log('Just fake - to keep node running!');
            });

            setTimeout(function(){}, 100000);
            process.stdin.resume();
        }
    }
}

更新1:

我的 Web Socket 提供商 CoinBase 最近更新了他们的 API。从 Coinbase-exchange 到 Gdax。我只是尝试替换:

var Gdax = require('gdax');
var CoinbaseExchange = require('coinbase-exchange');

//var websocket = new Gdax.WebsocketClient();
var websocket = new CoinbaseExchange.WebsocketClient();

现在我的应用正在等待!但是在只收到 1 个 json 对象后,我的节点应用程序仍然退出!??我如何使它保持连接打开而不仅仅是关闭?而是继续从 API 接收数据?

更新 2

当我删除我所有的测试代码并且只有与 API 相关的代码时,它可以工作 - 但只适用于旧的...coinbase-exchange?所以它一定是新的(gdax)API中的错误还是什么?但是没有抛出异常??

请在此处查看文档:

https://www.npmjs.com/package/coinbase-exchange#websocket-client

https://www.npmjs.com/package/gdax#websocket-client

DOC 的进一步说明(这没有任何意义 - 只有旧 API 仍在工作):

GDAX 转换 作为 Coinbase Exchange 更名为 GDAX 的一部分,API 端点发生了变化。旧的 *.exchange.coinbase.com 端点将继续工作到 2016 年 8 月 24 日。有关新端点,请参阅以下文档。

【问题讨论】:

  • 你是否在某个地方调用了 initws?
  • 是的 - 我的 initws() 是从我的 server.js 文件中调用的......我从 CMD 开始由“节点服务器”
  • 除非我错过了什么,否则您不会在代码中的任何地方等待连接。如果你这样做了,节点将不会退出。
  • websocket.on 正在等待响应...

标签: javascript node.js exit event-loop


【解决方案1】:

使用 setTimeout

您可以这样做 - 创建一个重新注册自身的超时:

var t;
function nt() {
  t = setTimeout(nt, 10000);
}
nt();

每次您都可以致电clearTimeout 将其关闭。例如,要让您的程序在 2 秒后退出,您可以添加:

setTimeout(function () {
  clearTimeout(t);
}, 2000);

因此,它甚至不必等待整整 10 秒(或任何间隔)完成。

使用 setInterval

您可以使用setInterval 使其更简单:

var i = setInterval(()=>{}, 10000);

你可以用clearInterval取消它:

setTimeout(function () {
  clearInterval(i);
}, 2000);

真正的问题

但是如果您的进程退出,那么很有可能它会这样做,因为它不再等待任何事情发生,这才是真正的问题。因此,在这种情况下,阻止 Node 退出可能无法解决您的问题 - 它只会等待什么都没有发生

【讨论】:

  • 我已经尝试使用 setInterval 函数...在我的 PreventExit 函数中...但它根本没有改变任何东西...所有这一切似乎都一样 - 什么都没有...?
  • setInterval 解决方案效果很好,唯一的事情是我将代码附在 Node REPL 中的 if(1){...} 中 - 在这里找到了另一个 lifehack。
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多