Javascript Socket.io对象,第一次发送时未发送数据[setInterval]

Javascript Socket.io对象,第一次发送时未发送数据[setInterval],javascript,node.js,function,websocket,socket.io,Javascript,Node.js,Function,Websocket,Socket.io,好的,我正在创建一个NodeJS应用程序。 它包括向API发送HTTP请求,API返回JSON数据,我希望使用socket.io实时向客户端显示JSON数据 我使用setInterval()以非常“x”秒的时间运行函数 我希望声明一个全局变量,然后在建立连接时调用该函数(socket.io),然后使用setInterval(),但似乎没有成功 问题是: 它显示前“x”秒的未定义数据。 这是我的代码(我正在删除不必要的部分) 注意:忽略大括号和圆括号错误,我从我的应用程序中删除了一些不必要的逻辑,

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

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

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

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


一句话:在前10秒钟,socket.io发出一个没有数据的对象,之后,setInterval()启动并从API中发送数据,我在这里看到的是,你一建立连接就发出“newdata”,但在此之前,你得到了
apirl
的响应

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

类似这样的内容(回调):

或者这个(承诺):


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

您需要对
bitstampAPI
执行初始请求以首先获取数据,因为
setInterval
在10秒后才会发出第一个请求
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)
})
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)
  });
});