角度承诺延迟不按预期方式工作
问题描述:
对不起,我不能在这里显示完整的代码,我想出了以下代码片段。 我有一个服务和控制器。 在服务中,我添加了2秒超时到我的组服务来测试微调加载。角度承诺延迟不按预期方式工作
但以某种方式在控制器中,我的代码马上运行,无需等待2秒钟。
我做了3个破发点,执行我所期望的顺序为:2-> 1-> 3 但是,它结束了与2-> 3-> 1
这里是我的服务。
groupService.get = function() {
var deffered = $q.defer();
deffered.promise = $getMyDataStuffPromise.then(function (data) {
$timeout(function() {
deffered.resolve(); <- break point 1
}, 2000);
}, function (error) {
deffered.reject();
console.log('group error', error);
});
return deffered.promise; <- break point 2
};
控制器:
$q.all([
PeopleSvc.get(),
GroupSvc.get()
]).then(function(data){
console.log('data returns, stop spinner'); <- break point 3
});
请你让我知道什么是错的代码?谢谢!
答
deffered.promise =
是非常奇怪的(我不知道还有什么可以称之为)。
但是你甚至不应该试图执行deferrred antipattern。 $timeout
已经返回一个承诺,让所有你需要做的,是给他们链条:
groupService.get = function() {
return $getMyDataStuffPromise.then(function (data) {
return $timeout(function() {
return undefined; // maybe data?
}, 2000);
});
};
答
那么这个问题的答案是:你必须分配给deferred.promise
错误的东西,所以它不工作
groupService.get = function() {
var deffered = $q.defer(); // deferred.promise already generated here
/*deffered.promise = */$getMyDataStuffPromise.then(function (data) {
$timeout(function() {
deffered.resolve();
}, 2000);
}, function (error) {
deffered.reject();
console.log('group error', error);
});
return deffered.promise;
};
当您拨打$q.defer()
时,已经生成了一个新的承诺对象,您将其重新分配给$getMyDataStuffPromise
,当然它会在早期解决。只需删除该任务即可。
当然,如你所愿,尽可能远离promise-antipattern,正如其他文章中的建议。
+0
谢谢!这解释了为什么这个承诺过早返回。 – innek
非常感谢你! – innek