Не удается прочитать ответ от AngularJS $resource JSONP получить от Yahoo Finance

Я могу получить цены на акции из Google Finance, используя ресурс Angular JS $ с JSONP. Это показано здесь: http://jsfiddle.net/8zVxH/1/

Мне нужны исторические цены, которые Google не предоставляет, но предоставляет Yahoo. Я изменил приведенный выше 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();

}

В консоли браузера выдает сообщение об ошибке:

ПОЛУЧИТЬ http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.исторические данные%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 (неверный запрос)

Кто-нибудь знает, как заставить это работать?

Я знаю, что getJSON Jquery можно использовать с этим запросом Yahoo, но предположительно $resource AngularJS быстрее и эффективнее.


person Curt    schedule 19.12.2012    source источник


Ответы (3)


Используйте службу angular $http.

С помощью функции jsonp из сервиса angular $http этого довольно легко добиться.

Сервис

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.

person asgoth    schedule 20.12.2012
comment
Спасибо за ваше предложение. Это было полезно. Однако он возвращает NULL. Это подтверждается путем ввода URL-адреса в браузере. Кроме того, URL-адрес, начинающийся с «ichart.yahoo.com», загружает цены для каждой исторической даты, а не только для дат между «от» и «до». Мне пришлось внести несколько изменений, которые можно увидеть здесь: jsfiddle.net/curt00/XY89Y/1 . Ваша функция getHistoricalData : и $log.info вызвали ошибки. Это команды Javascript? - person Curt; 20.12.2012
comment
Это была часть кастомного (углового) сервиса - person asgoth; 20.12.2012
comment
Отредактировал мой ответ. Я создал для вас jsfiddle. Это рабочий пример: http://jsfiddle.net/asgoth/7bNAd/. - person asgoth; 20.12.2012
comment
Я попытался вставить ваш новый код в свой. Но я застрял с этой ошибкой в ​​​​консоли: TypeError: Cannot call method 'getHistoricalData' of undefined. Это вызывается var promise = service.getHistoricalData(... Как мне обойти это? - person Curt; 21.12.2012
comment
Вы используете последний код из моего jsFiddle? Вы пробовали это в своем собственном jdFiddle - person asgoth; 21.12.2012
comment
Да, я скопировал ваш код. Я не пробовал свой собственный jsFiddle, так как вижу, что он работает в вашем. У меня есть _angular.app.js (с функцией AppCtrl($scope...), controller.stock.js (контроллер для stock.html) и index.html (с angular.module('app', ['filers '... Я попытался поместить ваш код, начинающийся с app.factory('service'..., в каждый из трех файлов, но все равно получаю неопределенную ошибку. Это только у меня так, или с AngularJS очень сложно работать ? - person Curt; 21.12.2012
comment
Я предлагаю вам сначала поместить его в мой файл javascript и разбить его, как только он заработает. - person asgoth; 21.12.2012

Как угловой нуб, это исправило это для меня.

Изменил мой jsonp с:

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

в

angular.callbacks._0({"term_jg_1":{"query":"Julia...
person user2449809    schedule 04.06.2013

Спасибо всем за предложения.

Предложение @asgoth выглядит хорошо, но мне не удалось заставить его работать в моем веб-приложении AngularJS.

Я заменил $resource на $http.jsonp, и теперь это работает. Пример:

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
    }
person Curt    schedule 28.12.2012