0

我可以使用带有 JSONP 的 Angular JS $resource 从 Google Finance 获取股票价格。这显示在这里:http: //jsfiddle.net/8zVxH/1/

我需要历史价格,谷歌不提供,但雅虎提供。我将上面的 jsfiddle 修改为:http: //jsfiddle.net/curt00/BqtzB/

这是代码:

angular.module('app', ['ngResource']);

function AppCtrl($scope, $resource) {

    var yqlURL="http://query.yahooapis.com/v1/public/yql?q=";

    var dataFormat="&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";

    var symbol = 'GOOG';

    var startDate = '2012-12-05';
    var endDate = '2012-12-06';

    var historical_query = yqlURL+"select%20*%20from%20yahoo.finance.historicaldata%20where%20symbol%20%3D%20%22"+ symbol +"%22%20and%20startDate%20%3D%20%22"+ startDate +"%22%20and%20endDate%20%3D%20%22"+ endDate +"%22"+ dataFormat;

    $scope.yahooFinance = $resource(historical_query, 
                                 {callback:'JSON_CALLBACK'},
                                 {get: {method:'JSONP', isArray: false}});

    $scope.indexResult = $scope.yahooFinance.get();

}

​ 它在浏览器控制台中生成错误消息:

GET http://query.yahooapis.com/v1/public/yql?q=select%20 *%20from%20yahoo.finance.historicaldata%20where%20symbol%20%3D%20%22GOOG%22%20and%20startDate% 20%3D%20%222012-12-05%22%20and%20endDate%20%3D%20%222012-12-06%22&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys?callback=angular。 callbacks._0 400(错误请求)

有人知道如何让它工作吗?

我知道 Jquery 的 getJSON 可以与这个 Yahoo 查询一起使用,但据说 AngularJS 的 $resource 更快更高效。

4

3 回答 3

3

使用 Angular 的 $http 服务。

使用 Angular 服务 $http 的函数 jsonp,很容易实现。

服务

var app = angular.module('myApp', []);

app.factory('service', function($q, $http) {

    return {
        getHistoricalData: function(symbol, start, end) {
            var deferred = $q.defer();
            var format = '&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=JSON_CALLBACK';
            var query = 'select * from yahoo.finance.historicaldata where symbol = "' + symbol + '" and startDate = "' + start + '" and endDate = "' + end + '"';
            var url = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent(query) + format;

            $http.jsonp(url).success(function(json) {
                var quotes = json.query.results.quote;
                // filter + format quotes here if you want
                deferred.resolve(quotes);
            });
            return deferred.promise;
        }
    };
});

控制器

function Ctrl($scope, service) {
    $scope.symbol = "GOOG";
    $scope.items = [];
    $scope.startDate = '2012-12-05';
    $scope.endDate = '2012-12-06';

    $scope.getData = function() {
        $scope.items = [];

        var promise = service.getHistoricalData($scope.symbol, $scope.startDate, $scope.endDate);

        promise.then(function(data) {
            $scope.items = data;
        });
    };
    $scope.getData();
}​

我在jsFiddle创建了一个工作示例。

于 2012-12-20T08:07:13.373 回答
1

作为一个 angularjs 菜鸟,这为我修复了它。

改变了我jsonp 的:

JSON_CALLBACK({"term_jg_1":{"query":"Julia.......

angular.callbacks._0({"term_jg_1":{"query":"Julia...
于 2013-06-04T00:23:59.443 回答
0

感谢大家提供建议。

@asgoth 的建议看起来很巧妙,但我无法让它在我的 AngularJS 网络应用程序上运行。

我用 $http.jsonp 替换了 $resource,现在它可以工作了。例子:

var query = 'select * from csv where url=\'http://ichart.yahoo.com/table.csv?s=' + symbol + '&a=' + (date.month - 1) + '&b=' + date.day + '&c=' + date.year + '&d=' + (date.month - 1) + '&e=' + date.day + '&f=' + date.year + '&g=d&ignore=.csv\'';
var url = 'http://query.yahooapis.com/v1/public/yql?q=' + fixedEncodeURIComponent(query) + '&format=json&callback=JSON_CALLBACK';

    $http.jsonp(url, {timeout: 30000}).success(function(json) {
        var result = json.query.results.row;
        //  process result
    }
于 2012-12-28T16:50:51.287 回答