角度承诺延迟不能按预期工作

时间:2016-07-07 00:05:47

标签: angularjs promise angular-promise

抱歉,我不能在这里显示完整的代码,我想出了以下代码片段。 我有一个服务和控制器。 在服务中,我向我的组服务添加了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
        });
你可以告诉我这段代码有什么问题吗?谢谢!

2 个答案:

答案 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,当然它会提前解决。只需删除分配即可。

可以肯定的是,正如其他帖子所建议的那样,尽可能远离承诺 - 反模式。