NodeJS + Socket.IO无法让json返回

时间:2013-09-29 19:28:45

标签: node.js angularjs socket.io

我正在使用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' }

1 个答案:

答案 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 });
    });
});

否则您将无法返回任何内容,因为您在拥有数据时已经超出了范围。您可以将其记录到控制台,但不能将其返回。