Я относительно новичок в JavaScript и буду благодарен вам за терпение.
Я пытаюсь подключить вызов метода для асинхронного запуска, но я немного застрял.
Я много искал и пробовал различные методы, но я чего-то не хватает.
Идея состоит в том, чтобы вызвать один метод за другим, но только после разрешения первого метода.
Я использую AngularJs
и Я не уверен, следует ли использовать $q
и $defer
, или простой способ формирования цепочки, или что-то совсем другое ...
Я видел ниже метод цепочки:
callFirst()
.then(function(firstResult){
return callSecond();
})
.then(function(secondResult){
return callThird();
})
.then(function(thirdResult){
//Finally do something with promise, or even return this
});
И этот пример использования $q
:
app.service("githubService", function ($http, $q) {
var deferred = $q.defer();
this.getAccount = function() {
return $http.get('https://api.github.com/users/haroldrv')
.then(function (response) {
// promise is fulfilled
deferred.resolve(response.data);
// promise is returned
return deferred.promise;
}, function (response) {
// the following line rejects the promise
deferred.reject(response);
// promise is returned
return deferred.promise;
})
;
};
});
Ниже приведена моя основная функция, и какой метод был бы наилучшим для моих целей и каким образом я мог бы реализовать наилучшее решение?
Примечание: На данном этапе в моей controller
, мои данные уже были возвращены из моего API
вызова, и я просто использовать данные для заполнения графы и сетки данных:
function formatDataAccordingToLocation(dataFromAPI) {
$scope.dataModel = DataModelService.dataLoaded();
dataFromAPI.then(function (data) {
$scope.totalItems = data.total_tweet_count;
if ($scope.volumeChartChanged) {
$scope.volumeChartChange = false;
configureVolumeChart(data);
}
else {
setSummaryPageData(data);
setTweetListPageData(data);
configureVolumeChart(data);
configureMostMentionedGraph(data);
configureFollowerGrowthGraph(data);
configureEngagementsGraph(data);
configureHashtagsGraph(data);
configureTweetsVsReTweetsGraph(data);
configureWordCloudGraph(data);
}
})
}
Я знаю, Я много прошу, и буду очень благодарен за вашу помощь.
Исследования и ресурсы:
https://docs.angularjs.org/api/ng/service/ $ Q
https://schier.co/blog/2013/11/14/method-chaining-in-javascript.html
Вам не нужно использовать $ q для обещаний в Angular, сам $ http возвращает обещание, поэтому вы можете связать '$ http.then()', где каждый из них будет вызываться после того, как предыдущий будет разрешен. – superUser
Благодарим за отзыв. Нужно ли мне вообще привязывать основную функцию (данные уже были возвращены из моей службы), или я просто вызываю одну функцию после другой в соответствии с моим кодом? – onmyway
Является ли ваше «DataFromApi» обещанием? или что именно вы хотите сделать? Вы хотите вызвать каждую из этих функций один за другим? – superUser