但不知何故,在控制器中,我的代码立即运行,无需等待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
});
你可以告诉我这段代码有什么问题吗?谢谢!
答案 0 :(得分:3)
deffered.promise =
非常奇怪(我不知道还有什么可以称之为。)
但你甚至不应该尝试实施deferrred antipattern。 $timeout
已经返回一个承诺,所以你需要做的就是将它们链接起来:
groupService.get = function() {
return $getMyDataStuffPromise.then(function (data) {
return $timeout(function() {
return undefined; // maybe data?
}, 2000);
});
};
答案 1 :(得分:1)
这个问题的答案是:你已经将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
,当然它会提前解决。只需删除分配即可。
可以肯定的是,正如其他帖子所建议的那样,尽可能远离承诺 - 反模式。