异步代码按顺序执行

时间:2016-05-02 19:09:23

标签: javascript angularjs

我正面临一个问题。我有angularjs函数,它反过来调用另一个有post请求的angularjs函数。当第一个函数结束时,这个帖子请求总是在最后触发..它不会被触发。

        servicePOST.send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{
             "date":d
             }).then(function(result) {
        console.log(result);

         });

请有人向我解释这个行为..对此的任何解决方法...我想顺序执行所有http请求。我是否实现了这个代码?提前谢谢!

3 个答案:

答案 0 :(得分:0)

根据您的问题我理解,您有一个页面,其中一个部分依赖于其他部分,依此类推。并且所有这些部分都由不同的2 http请求提供/呈现。

在这种情况下,您可以从第一个http请求的成功/已解决回调中生成第二个http请求,依此类推。 e.g。

servicePOST.send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{
         "date":d
         }).then(function(result) {
     $scope.dcrlocked = result.dcrlocked;
     $scope.leaves = result.leaves; 
     //$scope.holidays = result.holidays; 
     //make another http request as below.
     servicePOST2.send(url,{data or data from last request}).then(function(){
            // make another http request. and so on.
        })
     });

由于所有http请求都是从最后一个http请求的成功回调中产生的,因此它将保证顺序的http请求。

修改

您可以在第二个函数中使用$promise,在那里调用post请求。 e.g。

    var deferred = $q.defer();
    servicePOST.send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{
        "date":d
    }).then(function(result) {
        $scope.dcrlocked = result.dcrlocked;
        $scope.leaves = result.leaves; 
        //$scope.holidays = result.holidays; 
        deferred.resolve(result);
    });
    return deferred; // return deferred from your function.

不要忘记在控制器中注入$ q,然后将其传递给第二个函数。这将使post函数同步返回。如果您正在寻找,请告诉我。

答案 1 :(得分:0)

这可以帮到你

var TestService = function( $scope, servicePOST, AnotherService2,  AnotherService3 )
    {
        // Level 1
        servicePOST
            .send(appConstants.BASE_MS_URL + 'Dcrs/activityDay.php',{
             "date":d })// Request #1
            .then( function( result )                // Response Handler #1
            {
                 $scope.dcrlocked = result.dcrlocked;
                // Level 2
                AnotherService2                             //AnotherService Call
                    .send({})        // Request #2
                    .then( function( result  )              // Response Handler #2
                    {
                       $scope.leaves = result.leaves; 
                        // Level 3
                        AnotherService3
                            .send({})      // Request #3
                            .then( function( result )          // Response Handler #3
                            {
                               //$scope.holidays = result.holidays;
                            });
                    });
            });
    };

答案 2 :(得分:0)

简而言之,你无法做到。 Javascript在设计上是非阻塞的,你需要看一下promises或实现嵌套的回调。