AngularJS 中承诺的顺序和时间
Order and timing for promises in AngularJS
我不明白 AngularJS 中承诺的概念。我有两个功能:一个是获取远程设置配置,另一个是获取这个远程配置(存储在 $scope
中)。我需要将它们分开,因为我在应用程序的其他部分使用不同的超时或调用。
我以为有了 promises 一切都是 运行 一个接一个,在这里我发现我的 fetch 函数在 loading 函数之前开始。为什么?为什么系统正在等待下载我的设置,然后开始抓取?
/* ----- $scope.sea.funcs.seaInit(); ----- */
$scope.sea.funcs.seaInit = function() {
// PROMISES ORDER
var deferred = $q.defer();
var promise = deferred.promise;
// 0 : get distant config
promise.then(function() {
/* ----- SERVICE ConfigService.generale(); ----- */
ConfigService.generale({call: 'yes'}, function(responseSC) {
// store datas
$scope.datas.shared.configuration = responseSC[0];
console.log('load end');
});
});
// 1 : fetch stored distant config
promise.then(function() {
$scope.sea.funcs.seaConfigFetch();
});
// final resolve
deferred.resolve('ok');
}
/* ----- $scope.sea.funcs.seaConfigFetch(); ----- */
$scope.sea.funcs.seaConfigFetch = function() {
console.log('fetch start');
// here i do operations with $scope ...
}
/* ----- $scope.sea.funcs.seaInit(); call ----- */
$timeout($scope.sea.funcs.seaInit, 3000);
这里,'fetch start'出现在'load end'之前。我把服务直接放在第一个承诺中,因为我认为这是问题所在,但不是。
我有 $scope
个值的错误 'not defined'。
根据您上面的内容,您定义了 1 个承诺并附加了两个在解决时调用的函数,我想您想要的是在 ConfigServices.generale 完成后调用 seaConfigFetch .为此,您可以更新为以下内容:
/* ----- $scope.sea.funcs.seaInit(); ----- */
$scope.sea.funcs.seaInit = function() {
// PROMISES ORDER
var deferred = $q.defer();
var promise = deferred.promise;
// 0 : get distant config
/* ----- SERVICE ConfigService.generale(); ----- */
ConfigService.generale({call: 'yes'}, function(responseSC) {
// store datas
$scope.datas.shared.configuration = responseSC[0];
console.log('load end');
// final resolve
deferred.resolve('ok');
});
// 1 : fetch stored distant config
promise.then(function() {
$scope.sea.funcs.seaConfigFetch();
});
}
如果 ConfigService.generale 正在返回一个承诺,您可以进一步简化它以删除您创建的 $q.defer() 。或者完全删除承诺并在 deferred.resolve 处调用 seaConfigFetch。这是一篇关于带有承诺的常见反模式的好文章:http://taoofcode.net/promise-anti-patterns/
我不明白 AngularJS 中承诺的概念。我有两个功能:一个是获取远程设置配置,另一个是获取这个远程配置(存储在 $scope
中)。我需要将它们分开,因为我在应用程序的其他部分使用不同的超时或调用。
我以为有了 promises 一切都是 运行 一个接一个,在这里我发现我的 fetch 函数在 loading 函数之前开始。为什么?为什么系统正在等待下载我的设置,然后开始抓取?
/* ----- $scope.sea.funcs.seaInit(); ----- */
$scope.sea.funcs.seaInit = function() {
// PROMISES ORDER
var deferred = $q.defer();
var promise = deferred.promise;
// 0 : get distant config
promise.then(function() {
/* ----- SERVICE ConfigService.generale(); ----- */
ConfigService.generale({call: 'yes'}, function(responseSC) {
// store datas
$scope.datas.shared.configuration = responseSC[0];
console.log('load end');
});
});
// 1 : fetch stored distant config
promise.then(function() {
$scope.sea.funcs.seaConfigFetch();
});
// final resolve
deferred.resolve('ok');
}
/* ----- $scope.sea.funcs.seaConfigFetch(); ----- */
$scope.sea.funcs.seaConfigFetch = function() {
console.log('fetch start');
// here i do operations with $scope ...
}
/* ----- $scope.sea.funcs.seaInit(); call ----- */
$timeout($scope.sea.funcs.seaInit, 3000);
这里,'fetch start'出现在'load end'之前。我把服务直接放在第一个承诺中,因为我认为这是问题所在,但不是。
我有 $scope
个值的错误 'not defined'。
根据您上面的内容,您定义了 1 个承诺并附加了两个在解决时调用的函数,我想您想要的是在 ConfigServices.generale 完成后调用 seaConfigFetch .为此,您可以更新为以下内容:
/* ----- $scope.sea.funcs.seaInit(); ----- */
$scope.sea.funcs.seaInit = function() {
// PROMISES ORDER
var deferred = $q.defer();
var promise = deferred.promise;
// 0 : get distant config
/* ----- SERVICE ConfigService.generale(); ----- */
ConfigService.generale({call: 'yes'}, function(responseSC) {
// store datas
$scope.datas.shared.configuration = responseSC[0];
console.log('load end');
// final resolve
deferred.resolve('ok');
});
// 1 : fetch stored distant config
promise.then(function() {
$scope.sea.funcs.seaConfigFetch();
});
}
如果 ConfigService.generale 正在返回一个承诺,您可以进一步简化它以删除您创建的 $q.defer() 。或者完全删除承诺并在 deferred.resolve 处调用 seaConfigFetch。这是一篇关于带有承诺的常见反模式的好文章:http://taoofcode.net/promise-anti-patterns/