angular js: как вызывать несколько асинхронных http-запросов один за другим и сохранять ответы для последующего использования?

#javascript #angularjs

#javascript #angularjs

Вопрос:

Пожалуйста, пожалуйста, помогите: ( (разочарован)

У меня есть таблица в моей базе данных mysql, в которой хранится время записи avalabe;

На моем сайте есть кнопки to, которые пользователь может нажать и получить соответствующие доступные сроки бронирования, которые вы можете видеть на прилагаемом рисунке .

введите описание изображения здесь

Каждый раз, когда пользователь нажимает стрелку влево / вправо, я запускаю заводскую функцию, а затем получаю данные, содержащие множество книг, относящихся к этому дню, пока все работает нормально.

Проблема: когда пользователь впервые заходит на мой сайт, я получаю текущий день и показываю доступные времена книг, относящиеся к этому дню (сегодня), и когда пользователь нажимает стрелку влево / вправо, я получаю доступные книги, относящиеся к трем дням позже с сегодняшнего дня. это тоже работает нормально.

Но это медленно.

Я хочу, чтобы, когда пользователь заходил на мой сайт, я получал данные, относящиеся к сегодняшнему дню, вплоть до двух месяцев спустя.

Но я хочу показать только сегодняшние (и на следующий день, и на следующий 2day) книги avalabe. Поэтому, когда пользователь нажимает на стрелку влево / вправо, мне не придется вызывать другой http-запрос и заставлять пользователя ждать, пока мои данные будут доступны для просмотра.

Есть ли способ определить некоторые асинхронные http-запросы и сохранить данные об успешном обратном вызове, но не использовать их, пока пользователь не нажмет специальную клавишу (в моем случае стрелку влево / вправо)???

Вот моя функция http-запроса на заводе :

      app.factory('ShowBookingFacDrProfile',function($http){
         return{
             showbooking:function(scope){
                 $http.post("partials/search-drprofile/show_available_books.php",{today,nextday,next2day})// I just simplicized the object that I send here
                     .success(function(msg){
                       scope.booking=msg;;
                      //here I want to do something like this : 
                      then.post('sameURL',{next3day,next4day,next5day})
                     // I want to repeat this until 2 month later from today
                      then.post('sameURL',{next6day,next7day,next8day})

              }
         }
     });
 

связанный контроллер:

     $scope.hitArrow = function(current) {
    $scope.pager = current;
    SearchFac.search($scope);
};
 

Отмечая особое в моем контроллере

Я знаю, что могу использовать обещания ! , но как их сохранить? где?Как использовать их позже?

Я не могу сохранить их в новом scope.booking , например: scope.booking2 , потому что тогда я не смогу их правильно использовать: (

Я не могу использовать кеш, потому что, возможно, каждую минуту avalabe books меняется: (

Это мое мнение:

    <div class='col-xs-4'>
       <table class='table table-responsive' >
           <tr data-ng-repeat='v in booking |filter:{month:date.next2month} |filter:{day:date.next2day}'>
           <td><a>{{v.hour}}</a></td>
           </tr>
       </table>
   </div>

   <div class='col-xs-4'>
       <table class='table table-responsive' >
           <tr data-ng-repeat='v in booking |filter:{month:date.nextmonth} |filter:{day:date.nextday}'>
               <td><a>{{v.hour}}</a></td>
           </tr>
       </table>
   </div>

   <div class='col-xs-4'>
       <table class='table table-responsive' >
           <tr data-ng-repeat='v in booking |filter:{month:date.today} |filter:{day:date.today}'>
               <td><a>{{v.hour}}</a></td>
           </tr>
       </table>
   </div>
 

ПРИМЕЧАНИЕ
На самом деле я видел этот подход на этом сайте
Нажмите

Пожалуйста, посмотрите и нажмите на стрелки, вы увидите, как быстро появляется новое доступное время записи

Комментарии:

1. «Я не могу использовать кэш, потому что, возможно, каждую минуту avalabe books меняется». Если вы получаете доступные книги раз в минуту и сохраняете их локально, решает ли это эту часть проблемы?

2. На самом деле я мало что знаю о кэшировании:( Но я думаю, что в моей проблеме кэширование не поможет, потому что, если пользователь впервые заходит на мой сайт, обналиченных данных не будет! И моя проблема все еще существует: медленные запросы: (

3. возможно, ваша работа должна быть в вашем api, return и array по дате, поэтому вы делаете только один (больший, но уникальный) запрос

4. О, может быть, мой серверный сервер — это PHP и его очень простая база данных, и на странице я покажу 10 врачей с множеством книг avalabe, как я это сделаю? 🙁

5. Согласитесь с @bto.rdz, если производительность является проблемой, создайте конечную точку API, которая получает столько данных, сколько вы можете логически сгруппировать. Похоже, вы ждете завершения своего первого вызова, прежде чем начать свой 2-й (очень похожий) вызов и т.д. По возможности объедините их в один вызов.

Ответ №1:

Если $scope. booking — это массив, вам просто нужно добавить содержимое http-ответов (array.push(object)).

Комментарии:

1. Я не могу добавить новые данные к бронированию (кстати, это массив), потому что я не использую их, а ng-repeat всасывает более 2000 повторяющихся данных