1

我正在使用 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 datareturn 'hello world'“hello world”,客户端中将显示为{ data : 'hello world' }.

4

1 回答 1

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

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

于 2013-09-29T19:33:58.697 回答