我不理解AngularJS中的promise的概念。我有两个功能:一个用于获取远程设置配置,另一个用于获取此远程配置(存储在$scope
中)。我需要将它们分开,因为我在应用程序的其他部分使用不同的超时或调用每个部分。
我认为承诺一切都是一个接一个地运行,在这里我发现我的函数获取在加载函数之前开始。为什么?为什么系统等待下载我的设置,然后启动提取?
/* ----- $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
值的错误“未定义”。
答案 0 :(得分:1)
根据上面的内容,你定义了1个promise并附加了两个函数,当它被解析时,我想你想要的是在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返回一个promise,你可以更简化它以删除你创建的$ q.defer()。或者完全删除承诺并在deferred.resolve中调用seaConfigFetch。这是一篇关于共同反模式与承诺的好文章:http://taoofcode.net/promise-anti-patterns/