【问题标题】:Socket.io object with no data sent in the first go[setInterval]Socket.io 对象在第一次 go[setInterval] 中没有发送数据
【发布时间】:2017-01-16 21:41:48
【问题描述】:

好的,我正在创建一个 NodeJS 应用程序。 它涉及向 API 发送 HTTP 请求,该 API 返回 JSON 数据,我想使用 socket.io 实时显示给客户端 我正在使用 setInterval() 非常“x”秒运行该函数。

我希望声明一个全局变量,然后在建立连接时调用该函数(socket.io),然后使用 setInterval() 但它似乎没有成功。

问题: 它在前“x”秒内显示未定义的数据。 这是我的代码(我正在删除不必要的部分)

var globalObject = {}
function APICall () {
request.get(APIUrl, function (error, response, body) {
globalObject = JSON.parse(body)
 })}
io.on('connection', function (socket) {
APICall()
socket.emit('newdata', globalObject)
}

setInterval(function () {
request.get(bitstampAPI, function (error, response, body) {
    bitstamp = JSON.parse(body)
    socket.emit('price', bitstamp)
    })
  }, 10000)
})

P.S:忽略大括号和括号错误,我从我的应用程序中删除了一些不必要的逻辑,因此其中可能存在一些问题。

底线:在前 10 秒,socket.io 发出一个没有数据的对象,之后,setInterval() 启动并从 API 发送数据

【问题讨论】:

  • 您需要向bitstampAPI 发出初始请求以首先获取数据,因为setInterval 在 10 秒后才会发出第一个请求

标签: javascript node.js function websocket socket.io


【解决方案1】:

从我在这里看到的情况来看,您一获得连接就会发出'newdata',但之前您收到了来自APIUrl 的响应。

您应该更改您的APICall 函数以返回一个承诺或接收一个回调,然后您可以在实际更新globalObject 后发出'newdata'

类似这样的东西(回调):

var globalObject = {};
function APICall(callback) {
  request.get(APIUrl, function (error, response, body) {
    if (error) {
      // handle error
    } else {
      var data = JSON.parse(body);
      globalObject = data;
      callback(data);
    }
  });
}

io.on('connection', function (socket) {
  APICall(function(data) {
    socket.emit('newdata', data)
  });
});

或者这个(承诺):

var globalObject = {};
function APICall() {
  return new Promise(function (resolve, reject) {
    request.get(APIUrl, function (error, response, body) {
      if (error) {
        reject(error);
      } else {
        var data = JSON.parse(body);
        globalObject = data;
        resolve(data);
      }
    });
  });
}

io.on('connection', function (socket) {
  APICall().then(function (data) {
    socket.emit('newdata', data)
  });
});

PS 如您所见,我根本不会使用全局变量(并处理错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多