Javascript 角度$scope值按相反顺序设置

Javascript 角度$scope值按相反顺序设置,javascript,angularjs,Javascript,Angularjs,我已经在Angular上工作了一个月了。我一直在努力确定视图的范围并保持视图之间的状态 我不知道如何在angular中调试,所以在加载视图时,我使用控制台跟踪作用域的值 这是我的一个控制器: .controller('LegDetailCtrl',function($scope,$stateParams, LegService,ControllerService){ $scope.reservation = ControllerService.getReservation();

我已经在Angular上工作了一个月了。我一直在努力确定视图的范围并保持视图之间的状态

我不知道如何在angular中调试,所以在加载视图时,我使用控制台跟踪作用域的值

这是我的一个控制器:

.controller('LegDetailCtrl',function($scope,$stateParams, LegService,ControllerService){
    $scope.reservation = ControllerService.getReservation();
    LegService.getLeg($stateParams.legId).then(function(data){
        ControllerService.setLeg(data.data);
        $scope.leg = data.data;
        console.log('Check leg',angular.toJson($scope.leg));
    });

    $scope.seats = LegService.getSeats();
    $scope.pax = LegService.getPax();
    $scope.user = ControllerService.getUser();
    $scope.reservation.leg = $scope.leg;
    $scope.reservation.client = $scope.user;
    $scope.reservation.pax = $scope.pax;
    console.log('Check scope leg', angular.toJson($scope.leg));
})
据我所知,在JS中,执行是按照从上到下的顺序进行的(对此不确定)。我这样认为,我正在处理并设置$scope.leg值,然后使用它来提供$scope.reservation对象

对我来说,正确的控制台输出应该是:

log Check leg, {aJsonObject}
log Check scope leg, {anotherJsonObject}
但我得到的是:

log Check scope leg,
log Check leg, {aJsonObject}
因此,它似乎将所有值设置为作用域,然后执行LegService.getLeg()方法

如何使其以正确的顺序运行


提前感谢。

如果您在浏览器之外运行此代码,您会发现传递给
的回调中的
控制台.log
调用根本不会被调用。这是因为只有在解析了由
getLeg
返回的承诺之后才会调用回调,而在下一个
$digest
周期之前不会调用回调。

如果在浏览器之外运行此代码,您会发现传递给
然后
的回调中的
console.log
调用根本没有被调用。这是因为只有在解析了由
getLeg
返回的承诺之后才会调用回调,而在下一个
$digest
周期之前不会调用回调。

如果在浏览器之外运行此代码,您会发现传递给
然后
的回调中的
console.log
调用根本没有被调用。这是因为只有在解析了由
getLeg
返回的承诺之后才会调用回调,而在下一个
$digest
周期之前不会调用回调。

如果在浏览器之外运行此代码,您会发现传递给
然后
的回调中的
console.log
调用根本没有被调用。这是因为只有在解析了
getLeg
返回的承诺之后才会调用回调,而在下一个
$digest
周期之前,回调不会发生

LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用

执行延迟到javascript的事件循环为空(javascript仅为单线程)。 这意味着首先执行主函数的代码(结果是“Check scope leg”) 然后执行then块内的异步调用(“检查段”)

然后(
)在下面一行中

LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用

执行延迟到javascript的事件循环为空(javascript仅为单线程)。 这意味着首先执行主函数的代码(结果是“Check scope leg”) 然后执行then块内的异步调用(“检查段”)

然后(
)在下面一行中

LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用

执行延迟到javascript的事件循环为空(javascript仅为单线程)。 这意味着首先执行主函数的代码(结果是“Check scope leg”) 然后执行then块内的异步调用(“检查段”)

然后(
)在下面一行中

LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用

执行延迟到javascript的事件循环为空(javascript仅为单线程)。 这意味着首先执行主函数的代码(结果是“Check scope leg”)
然后执行then块内的异步调用(“Check leg”)

如果您使用的是chrome,那么AngularJS应用程序有一个很棒的调试工具,名为

为了解决你的问题,你可以像下面这样把你的承诺串起来

function LegDetailCtrl($stateParams, LegService, ControllerService){
    var vm=this;
    vm.reservation=ControllerService.getReservation();

    LegService
        .getLeg($stateParams.legId)
        .then(function(data){
            ControllerService.setLeg(data.data);
            vm.leg=data.data;
            return data.data;
        })
        .then(function(data) {
            var user=ControllerService.getUser();
            var pax=LegService.getPax();
            var seats=LegService.getSeats();

            vm.seats=seats
            vm.pax=pax
            vm.user=user
            vm.reservation.leg=vm.leg;
            vm.reservation.client=user
            vm.reservation.pax=pax
        });
}
LegDetailCtrl.$inject=['$stateParams', 'LegService', 'ControllerService'];

angular
    .module('yourModule')
    .controller('LegDetailCtrl', LegDetailCtrl)

如果你使用chrome,有一个很棒的AngularJS应用程序调试工具,叫做

为了解决你的问题,你可以像下面这样把你的承诺串起来

function LegDetailCtrl($stateParams, LegService, ControllerService){
    var vm=this;
    vm.reservation=ControllerService.getReservation();

    LegService
        .getLeg($stateParams.legId)
        .then(function(data){
            ControllerService.setLeg(data.data);
            vm.leg=data.data;
            return data.data;
        })
        .then(function(data) {
            var user=ControllerService.getUser();
            var pax=LegService.getPax();
            var seats=LegService.getSeats();

            vm.seats=seats
            vm.pax=pax
            vm.user=user
            vm.reservation.leg=vm.leg;
            vm.reservation.client=user
            vm.reservation.pax=pax
        });
}
LegDetailCtrl.$inject=['$stateParams', 'LegService', 'ControllerService'];

angular
    .module('yourModule')
    .controller('LegDetailCtrl', LegDetailCtrl)

如果你使用chrome,有一个很棒的AngularJS应用程序调试工具,叫做

为了解决你的问题,你可以像下面这样把你的承诺串起来

function LegDetailCtrl($stateParams, LegService, ControllerService){
    var vm=this;
    vm.reservation=ControllerService.getReservation();

    LegService
        .getLeg($stateParams.legId)
        .then(function(data){
            ControllerService.setLeg(data.data);
            vm.leg=data.data;
            return data.data;
        })
        .then(function(data) {
            var user=ControllerService.getUser();
            var pax=LegService.getPax();
            var seats=LegService.getSeats();

            vm.seats=seats
            vm.pax=pax
            vm.user=user
            vm.reservation.leg=vm.leg;
            vm.reservation.client=user
            vm.reservation.pax=pax
        });
}
LegDetailCtrl.$inject=['$stateParams', 'LegService', 'ControllerService'];

angular
    .module('yourModule')
    .controller('LegDetailCtrl', LegDetailCtrl)

如果你使用chrome,有一个很棒的AngularJS应用程序调试工具,叫做

为了解决你的问题,你可以像下面这样把你的承诺串起来

function LegDetailCtrl($stateParams, LegService, ControllerService){
    var vm=this;
    vm.reservation=ControllerService.getReservation();

    LegService
        .getLeg($stateParams.legId)
        .then(function(data){
            ControllerService.setLeg(data.data);
            vm.leg=data.data;
            return data.data;
        })
        .then(function(data) {
            var user=ControllerService.getUser();
            var pax=LegService.getPax();
            var seats=LegService.getSeats();

            vm.seats=seats
            vm.pax=pax
            vm.user=user
            vm.reservation.leg=vm.leg;
            vm.reservation.client=user
            vm.reservation.pax=pax
        });
}
LegDetailCtrl.$inject=['$stateParams', 'LegService', 'ControllerService'];

angular
    .module('yourModule')
    .controller('LegDetailCtrl', LegDetailCtrl)


如果你需要控制aync内容的顺序,你可以链接你的承诺。看起来你有这个案例,但真的很难说。Fiddle?@marko就是这样。我尝试过cbass的解决方案,但它没有处理数据来设置leg值。如果你需要控制aync内容的顺序,你可以链接你的承诺。看起来你这里有这个案例,但很难说。Fiddle?@marko确实是这样。我尝试过cbass的解决方案,但它没有处理数据来设置leg值。如果你需要控制aync东西的顺序,你可以链接你的承诺。看起来你有这个案例,但很难说。Fiddle?@marko就是这样。我已经尝试过了cbass的解决方案,但它不是通过处理数据来设置leg值。如果你需要控制aync的顺序,你可以连锁你的承诺。看起来你有这个案例,但真的很难说。Fiddle?@marko就是这样。我试过cbass的解决方案,但它不是通过处理数据来设置leg值。谢谢。它很有效好的。唯一的问题是显然,ControllerService.setLeg(data.data)没有处理。它使用LegServiceREST api的原始数据设置$scope.leg是的,它在链接PromiseSgreeting之前正确地处理了数据。我了解到为了执行调用