Второй запрос jsonp http get - использование $ q дает ошибку 404, несмотря на то, что GET показывает 200

Я нашел пару подобных сообщений, но ответы (которые сводятся к добавлению callback=JSONP_CALLBACK в запрос на получение) у меня не работают. Использование этого в запросе приводит к немедленной ошибке 404, а использование callback=angular.callbacks._0 по крайней мере позволяет первому запросу вернуть успешный ответ. Проблема в том, что использование одной и той же функции запроса с теми же параметрами во второй раз для обновления данных или получения следующих 20 объектов возвращает ошибку 404, даже если фактическое получение возвращает 200, и данные можно увидеть в инструментах Chrome.

Я новичок в использовании отложенных промисов $q, поэтому я надеюсь, что проблема как-то связана с нехваткой времени для ответа перед выполнением отклонения. Я прилагаю код, который включает Yelp API, как и пару других сообщений, которые я нашел по этой проблеме. Наиболее тесно связаны: (Последующие запросы JSONP дают статус 404, несмотря на статус GET 200), но есть еще один, который использует ту же строку обратного вызова, что и я (Yelp API и AngularJS).

Этот конкретный проект предназначен для ионного мобильного приложения, которое получает кофейни на основе геолокации пользователей.

Вот код службы (секреты удалены):

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

app.service("YelpService", function ($q, $http, $cordovaGeolocation, $ionicPopup) {
function randomString(length, chars) {
            var result = '';
            for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))];
            return result;
};
var method = 'GET';
var url = 'http://api.yelp.com/v2/search';
var consumerSecret = ''; //Consumer Secret
var tokenSecret = ''; //Token Secret
var self = {
    'page': 1,
    'isLoading': false,
    'hasMore': true,
    'results': [],
     'ranStr': randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'),
    'timeStamp':new Date().getTime(),
    'lat': 51.544440,
    'lon': -0.022974,
    'term': 'coffee',
    'oauthConKey': '', //Consumer Key
    'oauthToken': '', //Token
    'oauthSigMeth': 'HMAC-SHA1',
    'refresh': function () {
        self.page = 1;
        self.isLoading = false;
        self.hasMore = true;
        self.results = [];
        return self.load();
    },
    'next': function () {
        self.page += 1;
        return self.load();
    },
    'load': function () {
        self.isLoading = true;
        var deferred = $q.defer();
ionic.Platform.ready(function() {
$cordovaGeolocation
.getCurrentPosition({timeout:10000, enableHighAccuracy:false})
.then(function(position){
  self.lat = position.coords.latitude;
    self.lon = position.coords.longitude;

    console.log('latlong = '+self.lat+','+self.lon);
            var params = {
            callback: 'angular.callbacks._0',
            page: self.page,
             ll: self.lat+','+self.lon,
            term: self.term,
            oauth_consumer_key: self.oauthConKey, //Consumer Key
            oauth_token: self.oauthToken, //Token
            oauth_signature_method: self.oauthSigMeth,
            oauth_timestamp: self.timeStamp,
                //new Date().getTime(),
            oauth_nonce: self.ranStr
        };
        var signature = oauthSignature.generate(method, url, params, consumerSecret, tokenSecret, { encodeSignature: false});
         params['oauth_signature'] = signature;    
        console.log('url ='+url);
        console.log('params.ll = '+params.ll);
$http.jsonp(url, {params: params}).success(function (callback) {
                self.isLoading = false;
                console.log(callback.businesses);
        if (callback.businesses.length == 0) {
                    self.hasMore = false;
                } else {
                    angular.forEach(callback.businesses, function (business) {
                        self.results.push(business);
                    });
                }
                self.isLoading = false;
                deferred.resolve(callback.businesses);
            })
            .error( function (callback, status, headers, config) {
                self.isLoading = false;
console.error('data not received');
console.error('data: '+callback);
console.error('status: '+status);
console.error('headers:  '+headers);
console.error('congig: '+config);
                deferred.reject(callback);
            });  
}, function(err) {
    console.error('Error getting position');
    console.error(err);
    $ionicPopup.alert({
        'title': 'Please turn on geolocation',
        'template': 'It looks like you have geolocation turned off.    Please turn on geolocation in your app settings to use this app.'
    });
})
});


        return deferred.promise;

}
};    
self.load();

return self;
});

person R.Paris    schedule 10.12.2015    source источник
comment
Может ли это быть дубликатом stackoverflow.com/questions/36700384/?   -  person David Dal Busco    schedule 12.06.2016