2016-08-26 3 views
2

Здесь я вызываю fetchbookAllNew() метод от fetchBooks(), но с этим загрузчиком ajax не работает должным образом. Что я хочу, когда fetchBooks называется загрузчиком ajax, должен отображаться до тех пор, пока все данные не будут получены в функции .done.Как получить данные из нескольких вызовов ajax?

$scope.fetchBooks = function(){ 
     $(".loader").show(); 
     $.when(

       fetchbookAllNew("all"), 
       fetchbookAllNew("epub"), 
       fetchbookAllNew("collection"), 
       fetchbookAllNew("video"), 

      ).done(function(publishedAll, publishedEpub, publishedColl,publishedVideo){ 

        $scope.allkitabooBooks = publishedAll; 
       $scope.allEpubBooks =publishedEpub; 
       $scope.allcollectionbooks = publishedColl; 
       $scope.allvideosbooks = publishedVideo; 

       $(".loader").fadeOut("slow"); 
       }); 


    }; 

    var fetchbookAllNew = function(status){ 
      var books = undefined; 

      $.ajax({ 
        url:'/booksList', // Dynamically uploads the files which is chosen. 
        type: 'GET', 

        headers : { 
         'usertoken' : $rootScope.userDetails.userToken, 
         'status':status 
          }, 
        cache: false, 
        async: false, 
        processData: false,   // Don't process the files 
        contentType:'application/json', // Setting content type to "application/octet-stream"/"undefined" as jQuery will tell the server its not query string. 

        success: function (data) { 
         books=data; 

        }, 
        error: function (data) { 

        } 
       }); 
      return books; 

     }; 
+0

вам нужно «вернуть $ .ajax», а не ответ. – Liam

+0

Мне нужен ответ каждого запроса, чтобы показать данные в соответствии со статусом –

+0

Также reomve ajax: false. Это неправильное решение. Таким образом, у вас есть как минимум 3 разных проблемы. – Liam

ответ

1

Это должно сделать это, вам нужно вернуть обещание ajax, а не результат. done() решает результат для вас. More info

$scope.fetchBooks = function(){ 
     $(".loader").show(); 
     $.when(
       fetchbookAllNew("all"), 
       fetchbookAllNew("epub"), 
       fetchbookAllNew("collection"), 
       fetchbookAllNew("video"), 
      ).done(function(publishedAll, publishedEpub, publishedColl,publishedVideo){ 
       // Each argument is an array with the following 
       //     structure: [ data, statusText, jqXHR ] 
       //so [0] is data 
       $scope.allkitabooBooks = publishedAll[0]; 
       $scope.allEpubBooks =publishedEpub.data[0]; 
       $scope.allcollectionbooks = publishedColl.data[0]; 
       $scope.allvideosbooks = publishedVideo.data[0]; 
       $(".loader").fadeOut("slow"); 
       }); 
    }; 

    var fetchbookAllNew = function(status){ 
      return $.ajax({ 
        url:'/booksList', // Dynamically uploads the files which is chosen. 
        type: 'GET', 
        headers : { 
         'usertoken' : $rootScope.userDetails.userToken, 
         'status':status 
          }, 
        cache: false, 
        //async: false,//don't EVER do this 
        processData: false,   // Don't process the files 
        contentType:'application/json', // Setting content type to "application/octet-stream"/"undefined" as jQuery will tell the server its not query string. 
       }); 
     }; 

Никогда не используйте ajax:false. Он побеждает объект обещаний и ajax.

+0

Привет, его работа для одного вызова функции ajax: fetchbookAllNew(), но если у вас больше вызовов, когда я получаю таймаут. –

+0

Это не js. Если вы получите тайм-аут, то ваш сервер занимает слишком много времени или у вас есть проблема с блокировкой. – Liam

+0

Thanx Alot..its working :) –

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