如何在回调nodejs中停止流api

how to stop a stream api in callback nodejs

嗨,我正在使用 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)

谢谢。

根据上下文,我看到您正在使用 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.

连接

这是终止所有套接字连接的方法:

let endpoints = binance.websockets.subscriptions();
  for (let endpoint in endpoints) {
    console.log(endpoint);
    binance.websockets.terminate(endpoint)
  }