我正在使用Socket.IO,AngularJS,Request和Express,我正在尝试从请求中提取一些数据,然后将其发送给客户端。这是我的职能:
var getJsonFromJsonP = function (url, callback) {
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
var jsonpData = body;
var json;
try {
json = JSON.parse(jsonpData);
}
catch(e) {
var startPos = jsonpData.indexOf('({');
var endPos = jsonpData.indexOf('})');
var jsonString = jsonpData.substring(startPos+1, endPos+1);
json = JSON.parse(jsonString);
}
callback(null, json);
} else {
callback(error);
}
})
}
var getScoring = function() {
var url = 'http://live.nhle.com/GameData/RegularSeasonScoreboardv3.jsonp';
var dataReturn;
getJsonFromJsonP(url, function (err, data) {
console.log(data);
return data;
});
}
io.sockets.on('connection', function(socket) {
socket.emit('init', { data: getScoring() });
});
getJsonFromJsonP
解决方案来自另一个帖子,它产生了正常结果。
console.log(data)
在后端显示正确的数据,但客户端(AngularJS)没有得到它。如果我将return data
更改为return 'hello world'
,则“hello world”会在客户端中显示为{ data : 'hello world' }
。
答案 0 :(得分:1)
getScoring()
函数使用getJsonFromJsonP()
,这是异步的(因为它必须等待请求)。
所以你可能还想传递getScoring()
一个回调函数,然后在该回调中发出事件。像这样举例如:
var getScoring = function(callback) {
var url = 'http://live.nhle.com/GameData/RegularSeasonScoreboardv3.jsonp';
var dataReturn;
getJsonFromJsonP(url, function (err, data) {
//pass data to callback function
callback(data);
});
}
io.sockets.on('connection', function(socket) {
getScoring( function(data){
socket.emit('init', { data: data });
});
});
否则您将无法返回任何内容,因为您在拥有数据时已经超出了范围。您可以将其记录到控制台,但不能将其返回。