Angular 承诺不会 运行 同步
Angular Promise not running synchronously
我的 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 为空。数据已从函数 1 返回,所以我唯一能想到的是 function2 被调用得太早了。任何指针? :-)
$http({
url: 'url',
method: 'GET'
})
这也是一种承诺,因此它将 运行 异步。
$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...
};
在这种情况下,延迟承诺 is antipattern 和 initialize
应该像这样简洁:
var initialize = function () {
return $scope.function1().then(function() {
return $scope.function2();
})
};
我的 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 为空。数据已从函数 1 返回,所以我唯一能想到的是 function2 被调用得太早了。任何指针? :-)
$http({
url: 'url',
method: 'GET'
})
这也是一种承诺,因此它将 运行 异步。
$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...
};
在这种情况下,延迟承诺 is antipattern 和 initialize
应该像这样简洁:
var initialize = function () {
return $scope.function1().then(function() {
return $scope.function2();
})
};