-1

Я понимаю Угловые обещания, когда Angular делает запрос с $http, ожидается, что .then(function(res){ return res }) ждет, пока обещание не будет разрешено. Поэтому, если я привязал запрос к переменной, не должно ли значение переменной быть разрешено обещанием?Почему эта служба возвращает обещание, а не выполняемое обещание?

Service для вызова GitHub API

is.service('githubApiService', function($http) { 
    this.repo = function(user, repo) { 
     var value = $http.get('https://api.github.com/repos/' + user + '/' + repo).then(function(json) { 
      return { 
       stargazers_count: json.data.stargazers_count, 
       watchers_count: json.data.watchers_count, 
       forks_count: json.data.forks_count, 
       watchers: json.data.watchers, 
       subscribers_count: json.data.subscribers_count 
      }; 
     }); 

    return value; 
    }; 
}) 

директиву, которая вызывает службу

is.directive('chart', function(githubApiService) { 
    return { 
     restrict: 'E', 
     template: '<svg margin="[20, 30, 30, 40]", width="750" height="450"></svg>', 
     link: function(scope, element, attrs) { 
      var ais = githubApiService.repo('srph', 'angular-infinite-scroll'); 
      var ai = githubApiService.repo('thenikso','angular-inview'); 
      var ns = githubApiService.repo('jankuca', 'ng-scroller'); 

      console.log(ai); // returns a promise! 
     } 
    } 
}) 
+0

Nope. 'then' ждет * с выполнением обратного вызова * до тех пор, пока не будет выполнено обещание, и * возвращает другое обещание *. Он не блокирует ваш скрипт до тех пор, пока не будет выполнена асинхронная задача! – Bergi

+0

Выполненное обещание по-прежнему является обещанием, поэтому ваша формулировка немного странная. Я подозреваю, вы имеете в виду что-то другое. – zeroflagL

ответ

0

Вы не можете получить значение обетования, как вы ожидаете.

Если посмотреть на $q documentation, вы увидите, что then метод, который вы цепочки возвращается также обещание:

Этот метод возвращает новый посыл, который разрешен или отвергнут через возвращаемое значение successCallback, errorCallback (если это значение не обещание, и в этом случае она будет решена с величиной, которая будет решена в этом обещании, используя обещание цепочки)

Вы поэтому должны получить возвращаемое значение т с помощью обработчика успеха:

githubApiService.repo(...).then(function (data) { 
    // data is the object you are expecting 
}); 
+0

Спасибо, это был ответ, который я искал. –

1

Это ожидаемое поведение. Она возвращает обещание во всех сценариях, необходимо использовать .then(), чтобы получить данные, которые вы хотите:

githubApiService.repo('thenikso','angular-inview').then(function(data){ 
    var ai = data; 
}); 
0

Он возвращает обещание, потому что вы не знаете, когда базовый асинхронный вызов будет завершен.

В некоторых тривиальных случаях это может произойти почти сразу, но пока вы явно не «разрешите» выполненное или отклоненное обещание с помощью метода then, у вас просто есть реальное обещание.

Рассмотрим эти два метода, где doSomething возвращает обещание:

myService.doSomething().then(function(data){ 
     return data; 
    }); 

    myService.doSomething().then(function(data){ 
     //This is some non-trivial calculation that will take a few seconds to do 
     var myData = transformData(data); 
     return myData; 
    }); 

Обещание позволяет работать с обоими этими вызовами точно так же, где вы должны разрешить его вызова then метод и на самом деле не беспокоиться если данные готовы или нет в этой точке вашей программы.

Смежные вопросы