完成第一个请求后,调用第二个请求

时间:2018-03-22 06:38:33

标签: javascript angularjs

我有一个关于requests的问题。我发出第一个请求然后我想首先onSuccess方法将运行但程序立即发出第二个请求。我该如何处理它? Context.getAlarmGroupById立即被召唤2次。 我的代码:

        function loadAll () {
        Context.getAlarmGroupChainById({
            id: $stateParams.id
        }, onSuccess, onError);


            function onSuccess(data, headers) {
            vm.temp=data; 
            var numberGroupChain=vm.temp.length;
            for(var i=0; i<numberGroupChain; i++){
                vm.location.push(vm.temp[i].location);
                vm.alarmChainList.push({name: vm.location[i],active:null,totalAlarmGroupNumber:null});             
                //loadData(vm.temp[i].id);
                asyncLoop(vm.temp[i].id);
              }
            }


            function onError(error) {
              AlertService.error(error.data.message);
            }

        var index = 0;

        function asyncLoop(chainId) {
            if(index >= vm.temp.length) {
                return;
            }
         Context.getAlarmGroupById({
             id:chainId
         }, onSuccess, onError);


             function onSuccess(data,headers){
                 index++;
                 asyncLoop();
             }

             function onError(data,headers){
                 index++;
                 asyncLoop();
             }
        }

    } 

2 个答案:

答案 0 :(得分:1)

首先: Car.getGroupId是一个异步函数。因此,您必须确保在下一次通话之前完成上一次通话。

其次:创建递归函数以替换循环,在success函数和索引增量之后,调用递归函数以确保满足您的要求。

第三:在循环后更改asyncLoop(vm.temp[i].id);的调用顺序:

<强>最后:

请使用以下代码:

function loadAll () {

    var index = 0;

    function asyncLoop(chainId) {
        if(index >= vm.temp.length) {
            return;
        }
     Context.getAlarmGroupById({
         id:vm.temp[index].id
     }, onSuccess, onError);


         function onSuccess(data,headers){
             index++;
             asyncLoop();
         }

         function onError(data,headers){
             index++;
             asyncLoop();
         }
    }

    function onSuccessParent(data, headers) {
        vm.temp=data; 
        var numberGroupChain=vm.temp.length;
        for(var i=0; i<numberGroupChain; i++){
            vm.location.push(vm.temp[i].location);
            vm.alarmChainList.push({name: vm.location[i],active:null,totalAlarmGroupNumber:null});             
            //loadData(vm.temp[i].id);

          }
          asyncLoop();
    }


    function onErrorParent(error) {
          AlertService.error(error.data.message);
    }

    Context.getAlarmGroupChainById({
        id: $stateParams.id
    }, onSuccessParent, onErrorParent);

}

答案 1 :(得分:0)

这是纯粹的JavaScript方法,它可以完美地运行。使用Promise.then()。如下所示:

var request1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});

request1.then(function(value) {
  // make request2 here
});