Javascript 角度承诺不同步运行

Javascript 角度承诺不同步运行,javascript,angularjs,asynchronous,promise,synchronous,Javascript,Angularjs,Asynchronous,Promise,Synchronous,我的javascript控制器中有以下代码。这些函数在从视图独立异步调用时工作。但是,我希望在页面加载时同步调用它们,因为第一个函数的返回值用于第二个函数的调用 $scope.function1= function () { $http({ url: '/Class/method1/', method: 'GET' }).success(function (data) { $scope.mygrid= data.data;

我的javascript控制器中有以下代码。这些函数在从视图独立异步调用时工作。但是,我希望在页面加载时同步调用它们,因为第一个函数的返回值用于第二个函数的调用

$scope.function1= function () {
    $http({
        url: '/Class/method1/',
        method: 'GET'
    }).success(function (data) {
        $scope.mygrid= data.data;
        $scope.myvalue= $scope.mygrid[0];
    });
};

$scope.function2= function () {
    $http({
        url: '/class/method2/',
        method: 'POST',
        params: { myValue: $scope.myvalue }
    }).success(function (data) {
        $scope.myValue2 = data.data;
    });
};

 var initialize = function () {
    var defer = $q.defer();
    defer.promise
        .then(function() {
           $scope.function1();
        })
        .then(function() {
           $scope.function2();
        })
defer.resolve();
  }; 
initialize();
在第二次调用中,$scope.myvalue为null。数据已经从函数1返回,所以我唯一能想到的是函数2被调用得太早了。有什么指示吗?:-)

这也是一种承诺,因此它将异步运行

$scope.function1= function () {//3rd step
    $http({
        url: '/Class/method1/',
        method: 'GET'
    }).success(function (data) {
        $scope.mygrid= data.data; //this run as asyn after response recived
        $scope.myvalue= $scope.mygrid[0];
    });
};

$scope.function2= function () { //5th step
    $http({
        url: '/class/method2/',
        method: 'POST',
        params: { myValue: $scope.myvalue }
    }).success(function (data) {
        $scope.myValue2 = data.data; //this run as asyn after response recived
    });
};

 var initialize = function () {
    var defer = $q.defer();
    defer.promise
        .then(function() {
           $scope.function1(); //2nd step
        })
        .then(function() {
           $scope.function2(); //4th step
        })
defer.resolve(); //1st step
  }; 
initialize();

initialize
中的承诺同步运行。而
$http
请求不会。这会导致调用
$scope.function2
,而无需等待
$scope.function1
中的承诺来解析

应该是

$scope.function1= function () {
    return $http...
};

$scope.function2= function () {
    return $http...
};
在这种情况下,延迟承诺和
initialize
应尽可能简洁:

 var initialize = function () {
    return $scope.function1().then(function() {
           return $scope.function2();
    })
  }; 

承诺从来都不是同步的。您需要
返回
它们,然后从
回调,从您的作用域
函数n
s返回它们,否则它们无法知道您要等待什么。如果希望函数2在函数1之后运行,则应在函数1成功时调用,或者在检查函数1返回预期数据后在其他地方调用。
 var initialize = function () {
    return $scope.function1().then(function() {
           return $scope.function2();
    })
  };