2017-03-08 77 views
0

我有角度控制器调用服务的方法;此方法应基于服务响应进行操作。angularjs控制器中的顺序执行

但我不知道为什么在正确的时间调用方法。

$scope.UpdateSelected = function() { 
 
    $rootScope.showConfirmModal().result.then(function() { 
 
     var selectedItems = _.filter($scope.Options, { Selected: true }); 
 
     var error = 0 
 

 
     for (var i = 0 ; i < selectedItems.length; i++) { 
 
      InvalidOptionsFactory.UpdateOptions(selectedItems[i].Id).then(function (res) { 
 
       if (res.data.error) { 
 
        error++; 
 
       } 
 
      }); 
 
     } 
 
      if (error == 0) { 
 
       toastr.success($rootScope.GetString('GENERIC_SAVE_SUCCSS_MSG')); 
 
      } 
 

 
      else if (error == selectedItems.length) { 
 
       $rootScope.showMessageModal($rootScope.GetString('UPDATE_STATUS_FAILED'), 'sm'); 
 
      } 
 
      else { 
 
       var message = hasError + $rootScope.GetString('UPDATE_STATUS_PARTIALLY_FAILED'); 
 
       toastr.success(message); 
 
      } 
 
      fetchSearchedData(); 
 
    }); 
 
    };

我现在不为什么它直接进入if语句并执行它,然后调用服务

+0

询问具体。并且请不要责怪if条件。首先调试代码。 –

+0

我之前已经调试了代码,它不是按顺序执行的 – user7157121

+0

您的代码似乎不是有效的,缺少一些大括号和圆括号 – phuzi

回答

1

这是因为InvalidOptionsFactory.UpdateOptions(selectedItems[i].Id)方法是异步的。这就是应用程序不会等待服务调用的原因,它首先运行if (error == 0)声明(请参阅下面的代码片段以获取证明)。在这里学到的异步方法:https://www.pluralsight.com/guides/front-end-javascript/introduction-to-asynchronous-javascript

你可以让你的代码是这样的(附注:我用巴贝尔作为prepocessor):

$scope.UpdateSelected = function() { 
    $rootScope.showConfirmModal().result.then(function() { 
    var selectedItems = _.filter($scope.Options, { Selected: true }); 
    checkForError(selectedItems).then(error => { 
     if (error == 0) { 
     toastr.success($rootScope.GetString('GENERIC_SAVE_SUCCSS_MSG')); 
     } else if (error == selectedItems.length) { 
     $rootScope.showMessageModal($rootScope.GetString('UPDATE_STATUS_FAILED'), 'sm'); 
     } else { 
     var message = hasError + $rootScope.GetString('UPDATE_STATUS_PARTIALLY_FAILED'); 
     toastr.success(message); 
     }; 

     fetchSearchedData(); 
    }); 
    }); 
}; 

function checkForError(selectedItems): Promise<number> { 
    return new Promise(resolve => { 
    var error = 0; 
    for (var i = 0 ; i < selectedItems.length; i++) { 
     InvalidOptionsFactory.UpdateOptions(selectedItems[i].Id).then(function (res) { 
     if (res.data.error) { 
      error++; 
     }; 
     }); 
    }; 

    resolve(error); 
    }); 
} 

function asyncFunc(): Promise<void> { 
 
    return new Promise(resolve => { 
 
    console.log("this is async"); 
 
    resolve(); 
 
    }); 
 
} 
 

 
asyncFunc().then(() => { 
 
    console.log("async function ended"); 
 
}); 
 

 
console.log("this will be called before async function ended");