我需要实时获取货币报价,而无需重新加载页面和单击按钮。
为解决此问题,我们不得不采用以下技术:node js,websocket.io,Redis,数据供体API。
在控制台中,我得到以下数据:
{"symbol": "EURUSD", "bid": 1.13624, "ask": 1.13624, "price": 1.13624}
事实上,一切正常,这就是我所需要的。但是,我无法弄清楚如何将相同的数据传输到浏览器,这样就可以了:
EURUSD | bid - 1.13624 | ask - 1.13624 | price - 1.13624
这是js代码:
const redis = require('redis');
const settings = {
REDIS: {
HOST: 'localhost'
}
}
let redisClient = new redis.createClient(settings.REDIS);
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
function getQuote(symbol, callback) {
redisClient.get(symbol, (error, quote) => {
if (error) {
throw new Error(error);
}
quote = JSON.parse(quote);
callback(quote);
});
}
setInterval(() => {
getQuote('EURUSD', (q) => {
const formattedQ = `${q.SYMBOL} | bid - ${q.bid} | ask - ${q.ask} | price - ${q.price}`;
console.log(formattedQ);
});
}, 10);
io.on('connection', function(socket){
socket.on('get_quote', function(msg){
io.emit('get_quote', getQuote('EURUSD', (q) => /* ??? what to insert here? -> (formattedQ) ??? */));
});
});
和HTML文件:
<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
$(function () {
var socket = io();
socket.on('get_quote', function(msg){
// ??? what to insert here to update quotes without rebooting ???
});
});
</script>
答案 0 :(得分:0)
我认为更合适的方法是按原样发送json,并在客户端中对其进行格式化。
/* redis connection code */
setInterval(() => {
getQuote('EURUSD', (q) => {
const formattedQ = `${q.SYMBOL} | bid - ${q.bid} | ask - ${q.ask} | price - ${q.price}`;
console.log(formattedQ);
});
}, 10);
我正在修改答案,因为我认为显示一段我认为可行的代码会更容易。
为了将数据从服务器发送到客户端,您应该使用io.emit()
函数,但是您将其包装在socket.on('get_quote')
中。基本上会发生的情况是,只有在收到消息时才会发出新消息(导致死锁)。
我相信该代码段应该可以工作:
io.on('connection', function(socket){
setInterval(() => {
getQuote('EURUSD', (q) => {
io.emit('get_quote', q);
});
}, 10);
});
这将在与服务器建立连接时初始化一个间隔,并每10秒发出一个新的q
。
然后,在HTML文件中,您应该收到q(以JSON形式),并按照您选择的方式对其进行格式化:
socket.on('get_quote', function(msg){
console.log(`${msg.SYMBOL} | bid - ${msg.bid} | ask - ${msg.ask} | price - ${msg.price}`);
});