Angularjs обещание не разрешается должным образом

Мой контроллер имеет все необходимые зависимости.

 $scope.connect = function(url) {
    var defer = $q.defer();
    var promise = $http.get(url).then(function (response) {
         $timeout(function(){
                defer.resolve(response);
            },10000);
        defer.resolve(response);
        $scope.$apply();  //$rootScope.$apply();
    });
    return defer.promise;
 };

$scope.mymethod = function(){
    $scope.globalMydata[];
    console.log("before the http get");
    $scope.connect("MY_URL").then(function(data) {
         console.log("called!", data);
         console.log("INSIDE the http get");
         $scope.mydata = data;
         //$scope.globalMydata.push(data);            
    });
     console.log("after the http get ");
    //do some processing of the returned data here
    var dataHolder = $scope.mydata;
    return calculatedValue;//value from procesing

}

Когда код выполняется "ВНУТРИ, http get" вызывается как последний журнал отладки. Я получаю результаты от вызова get, но так как он возвращается позже, я не могу выполнить какую-либо обработку с ним. Это точная причина, почему мы обещаем правильно? Мне нужны обещанные данные для некоторой обработки внутри контроллера.

Любая проблема в моей реализации обещания?

1 ответ

Решение

Я не уверен, получу ли я ваш вопрос, но похоже, что вы создали перехватчик обещаний, но из вашего вопроса похоже, что вы хотите просто обычное поведение обещания. Так что я попробую это..

Я не специалист по угловым вопросам, но я часто использую обещания $ http, и вот как я это делаю.

Я регистрирую вызов $ http как сервис, например:

app.service('ajax',function(host,$http){
  this.post = function(api,data,cb){
    $http.post(host + api,data).success(cb)
  };
  this.get = function(api,cb){
    $http.get(host + api).success(cb)
  }
});

Хост - это предопределенное значение module.value. Я внедряю эту службу в каждый контроллер, который должен вызывать http-запросы и управлять ими следующим образом:

ajax.post('users', UserToken, function(data){
  console.log('Users points: ' + data.points)
})

Как я понимаю, $ http имеет встроенные обещания, поэтому нет необходимости в q и defre, все это делается в фоновом режиме. ajax.post вызывает сервис, который отправляет data в host + 'users'серверная сторона ищет пользователя по его токену и возвращает некоторые данные одним ключом по имени points со значением пользовательских баллов. На стороне клиента: после успешного ответа от сервера он переходит к cb функция, которая затем консоль регистрирует пользовательские очки.

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

success а также error у методов есть еще несколько необязательных аргументов, посмотрите их здесь.

Другие вопросы по тегам