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