【问题标题】:angular promise delay doesn't work as expected角度承诺延迟无法按预期工作
【发布时间】:2016-07-07 11:33:50
【问题描述】:

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

你能告诉我这段代码有什么问题吗?谢谢!

【问题讨论】:

    标签: angularjs promise angular-promise


    【解决方案1】:

    deffered.promise = 很奇怪(不知道还能叫什么)。

    但您甚至不应该尝试实现deferrred antipattern$timeout 已经返回了一个承诺,所以你需要做的就是链接它们:

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

    【讨论】:

      【解决方案2】:

      这个问题的答案是:你把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()时已经生成了一个新的promise对象,你将它重新分配给$getMyDataStuffPromise,当然它会更早解决。只需删除作业即可。

      当然,按照其他帖子中的建议,尽可能远离 promise-antipattern。

      【讨论】:

      • 谢谢!这解释了为什么承诺返回得太早。
      猜你喜欢
      • 2017-06-25
      • 2016-07-27
      • 2018-09-19
      • 2021-08-13
      • 1970-01-01
      • 2019-12-03
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多