在http post AngularJS异步中使用循环

时间:2016-09-14 12:24:43

标签: javascript angularjs


我想使用foreach逐项获取并将其传递给http post。

例如,我想在课程中获取所有章节,我得到这个[”angularjs","react","ionic"],我想通过angularjs来获取所有章节 angualrjs的教训。

这是我的代码。

//  asynchronous http
         $scope.allLessons = [];
                    var init = function () {
                          var x = JSON.parse($localStorage.currentUser);
                           $http({
                           method: 'POST',
                           url: 'http://localhost/hrm/public/checkLs',
                           data:  {email: x.email}
                           }).success(function (data) {
                               $scope.isRole.push(data);
                               console.log($scope.allLessons);
                               $scope.isRole.forEach(rr){
                                   $http({
                                       method: 'POST',
                                       url: 'http://localhost/hrm/public/hpers',

                                       data: {
                                            name: rr
                                       },
                                   }).success(function (data) {
                                       console.log(data);
                                   }).error(function (data) {
                                       console.log(data);
                                   });
                               };

                           }).error(function (data) {
                               console.log(data);
                           });
                    };
                    init();

因此,在第一个http中,我获得了一系列课程[”angularjs","react"....]。在第二个我得到一个错误。

我的后端得到的课程字符串不是数组的名称,所以我怎样才能通过课程来获取我想要的课程的章节?

如何以及为什么最好为什么异步?并谢谢。

3 个答案:

答案 0 :(得分:0)

$scope.isRole.forEach(function(rr){
   $http({
       method: 'POST',
       url: 'http://localhost/hrm/public/hpers',

       data: {
            name: rr
       },
   }).success(function (data) {
       console.log(data);
   }).error(function (data) {
       console.log(data);
   });
});

答案 1 :(得分:0)

使用可以在async.js中使用async waterfall。它用于处理异步调用。

http://caolan.github.io/async/docs.html#.waterfall

async.waterfall([
        function(callback) {
            $http({
                method: 'POST',
                url: 'http://localhost/hrm/public/checkLs',
                data: { email: x.email }
            }).success(function(data) {
                $scope.isRole.push(data);
                console.log($scope.allLessons);
                callback(null, isRole);
            });
        },
        function(isRole, callback) {
            // arg1 now equals 'one' and arg2 now equals 'two'
            isRole.forEach(rr) {
                $http({
                    method: 'POST',
                    url: 'http://localhost/hrm/public/hpers',

                    data: {
                        name: rr
                    },
                }).success(function(data) {
                    console.log(data);
                    callback(null, data);
                }).error(function(data) {
                    callback(err, null);
                });
            };
        }
    ],
    function(err, result) {
        // result now equals 'done'
    });

答案 2 :(得分:0)

为了实现同步,您可以执行以下操作。

//post requests 
    var Requests = [
      {
      url:"your url1",
      data:"your data"
      },
      {
      url:"your url2",
      data:"your data"
      },
      ];

  if (Requests.length>0) {
     var exit = false;
     var len = Requests.length-1;
     executePost(0, Requests, len);
  }

     var executePost = function (i, Requests, len)
        {
          if (Requests[i]!=undefined && (i<=len)) 
           {
             var request = Requests[i];
             var url = request.url;
             var data = request.data;
             $http.post(url, data, { headers: { "contentType": "application/json; charset=utf-8" } })
             .then(function (success) 
               {
                 console.log("Processed  " + (i + 1));              //processed log
//you can store the data to any variable here

                   if ((i + 1) <= len) {
                       executePost(i + 1, Requests, len);
                   }
               },
              function (error) 
               {
                console.log("Unsuccessfull  " + (i + 1)); 
              });
          }
       }

这里,具有三个参数的函数executePost被递归调用。