我對angular和http調用頗爲陌生。JavaScript中的承諾(angular)
然後我讀了一些關於承諾異步調用。我根本無法理解它。 所以我需要一些幫助來知道如果即使走向正確的方向。
我正在爲使用YouTube API v3編寫獲取Videoes的API以及有關它們的詳細信息(視圖等)。
但是我似乎得到一個錯誤,因爲我的數組一直是空的。
/*var promises = [];*/ // PROMISE
var videometrics;
var videodetails = [];
var deferred = $q.defer();
$http.get('https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=' + playlistId + '&key=AIzaSyDQv-WpATIWLinCB3H_sH4W1sKx7plyvRA')
.success(function (response) {
for (var i = 0; i < response.items.length; i++) {
var video = {
id: response.items[i].snippet.resourceId.videoId,
title: response.items[i].snippet.title
};
$scope.video.push(video)
}
/*console.log($scope.video)
var promises = [];*/
for (i = 0; i < $scope.video.length; i++) {
/*console.log("looping")
console.log($scope.video)
console.log("Vi henter fra id:")
console.log($scope.video[i].id)*/
$http.get('https://www.googleapis.com/youtube/v3/videos?part=statistics&id=' + $scope.video[i].id + '&key=AIzaSyDQv-WpATIWLinCB3H_sH4W1sKx7plyvRA')
.success(function (responsevideo) {
/*console.log($scope.video[i].id);*/
// console.log("we are in the metric loop")
// console.log($scope.video[i].id)
// console.log($scope.video[i].title)
// console.log(responsevideo)
videometrics = {
id: responsevideo.items[0].id,
views: responsevideo.items[0].statistics.viewCount,
likes: responsevideo.items[0].statistics.likeCount,
dislikes: responsevideo.items[0].statistics.dislikeCount,
favorites: responsevideo.items[0].statistics.favoriteCount,
comments: responsevideo.items[0].statistics.commentCount
};
videodetails.push(videometrics);
deferred.resolve(responsevideo);
/*detailsOnVideos = $scope.videometrics;*/
})
/* videodetails.push(videometrics);*/
}
/*promises.push(videodetails);*/ // PROMISE
console.log(videodetails);
/* console.log(promises);*/ //PROMISE LOGGER
/* console.log(videodetails);*/
console.log($scope.video);
console.log("")
pagetokenarr = response.nextPageToken;
console.log(pagetokenarr)
});
return deferred;
/*return $q.all(promises);*/ // PROMISE
當你看到我的第一個http get,是functionel,但下一個不是。我不明白爲什麼。但是,如果我把我的videodetails數組放入promise數組中,它就可以工作。然後再次。我不知道爲什麼。
非常感謝!我已經嘗試了很多forEach(第一次我嘗試了他們),現在我知道他們是如何工作的。我明白了你對在http調用之前執行的console.log的看法。完善! – SpaceChimps
我的文章解釋了爲什麼它不能正常工作並給出解決方法。但是爲了更清晰地完成$ http調用(服務),請記住@Sphaso的答案 – Okazari