【问题标题】:how to stop a stream api in callback nodejs如何在回调nodejs中停止流api
【发布时间】:2021-03-13 16:15:15
【问题描述】:

嗨,我正在使用 binance api,它有一个如下所示的流函数,我不知道在 if 语句为真后如何停止它。

binance.websockets.bookTickers("BNBUSDT", (res) => {
  if (res.bestAsk > 250) {
    // i want to finish this stream here
  }
});

运行结果是这样的:

  {
  updateId: 4510982,
  symbol: 'BNBUSDT',
  bestBid: '276.10010000',
  bestBidQty: '0.24000000',
  bestAsk: '277.77770000',
  bestAskQty: '0.99000000'
}
(always running - infinite loop)

谢谢。

【问题讨论】:

    标签: javascript node.js api stream


    【解决方案1】:

    从上下文中我看到您使用的是binance-node-api

    不幸的是,他们的代码没有取消订阅特定 websocket 流的方法。

    1. bookTickets 流是在 line 5755 上创建的。如果它的处理程序被保存到某处的(可访问的)变量中,您可以调用它的方法.close() 来关闭流。但是...
    2. line 5756 上,仅返回其名称并且流处理程序不保存到任何变量。因此,在 bookTickers 函数之外,目前无法关闭流。

    最简单的方法是在不需要数据时立即开始忽略流。缺点当然是你在不需要的东西上浪费资源,并且打开你的应用程序有更多潜在的故障(如果流抛出错误或导致内存泄漏怎么办?)。

    const Binance = require('node-binance-api');
    const binance = new Binance();
    
    let isTickersProcessed = false;
    
    const websocket = binance.websockets.bookTickers("BNBUSDT", (res) => {
        if (isTickersProcessed) {
            return;
        }
    
        if (res.bestAsk > 250) {
            console.log(res);
            isTickersProcessed = true;
        }
    });
    

    或者使用不同的包装器模块,让您更好地控制流。或者直接使用websocket连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      相关资源
      最近更新 更多