2016-07-07 76 views
1

对不起,我不能在这里显示完整的代码,我想出了以下代码片段。 我有一个服务和控制器。 在服务中,我添加了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 
     }); 

请你让我知道什么是错的代码?谢谢!

回答

3

deffered.promise =是非常奇怪的(我不知道还有什么可以称之为)。

但是你甚至不应该试图执行deferrred antipattern$timeout已经返回一个承诺,让所有你需要做的,是给他们链条:

groupService.get = function() { 
    return $getMyDataStuffPromise.then(function (data) { 
     return $timeout(function() { 
      return undefined; // maybe data? 
     }, 2000); 
    }); 
}; 
+0

非常感谢你! – innek

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,当然它会在早期解决。只需删除该任务即可。

当然,如你所愿,尽可能远离promise-antipattern,正如其他文章中的建议。

+0

谢谢!这解释了为什么这个承诺过早返回。 – innek