2016-12-13 2 views
0

Я относительно новичок в 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

Chain promises with AngularJS

https://schier.co/blog/2013/11/14/method-chaining-in-javascript.html

+0

Вам не нужно использовать $ q для обещаний в Angular, сам $ http возвращает обещание, поэтому вы можете связать '$ http.then()', где каждый из них будет вызываться после того, как предыдущий будет разрешен. – superUser

+0

Благодарим за отзыв. Нужно ли мне вообще привязывать основную функцию (данные уже были возвращены из моей службы), или я просто вызываю одну функцию после другой в соответствии с моим кодом? – onmyway

+0

Является ли ваше «DataFromApi» обещанием? или что именно вы хотите сделать? Вы хотите вызвать каждую из этих функций один за другим? – superUser

ответ

0

В соответствии с большой обратной связи и комментариев от Полсона Петра и suzo, следующий будет ответом на мой вопрос:

Поскольку моя основная функция (formatDataAccordingToLocation) находится внутри моего возвращенного успешного звонка $http, мне не нужно связывать эти вызовы с обещаниями и при этом задерживать выполнение.

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