2015-11-03 88 views
-1

我瞭解Angular承諾,當Angular以$http請求時,.then(function(res){ return res })應該等到承諾解決。因此,如果我將請求附加到一個變量,那麼該變量的值是不是該解決的承諾?爲什麼這項服務回報承諾而不是履行承諾?

服務調用API Github上

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

沒有。 '然後'等待*執行回調*直到承諾完成,*返回另一個承諾*。它不會阻止您的腳本,直到異步任務完成! – Bergi

+0

履行承諾仍然是一個承諾,所以你的措辭有點奇怪。我懷疑你的意思是不同的。 – zeroflagL

回答

0

像你期望你不能得到承諾的價值。

如果你看一下$q documentation,你會看到then方法,你要串聯的回報也是一個承諾:

該方法返回一個新的承諾,這是通過的返回值解決或拒絕successCallback,errorCallback(除非該值是一個承諾,在這種情況下,它是與在這一承諾使用承諾鏈接解析值來解析)

你因此必須得到返回的值t通過成功處理程序:

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方法調用來解決它,而不是真正擔心如果數據在您的程序中已準備好或沒有。