【问题标题】:AngularJS promise chainAngularJS 承诺链
【发布时间】:2013-09-03 21:38:15
【问题描述】:

我的应用程序应该打开一个弹出窗口,要求用户确认,然后进行 ajax cal 并关闭弹出窗口。
我尝试使用 promise 链来做到这一点(我已经使用过它,我记得它应该以这种方式工作),但它似乎在调用reservationService.confirm($scope.object); 后阻塞。现在它是一个用setTimeout$q 实现的假服务,只是为了返回一个承诺(将来它将进行ajax 调用)。这是一个有效的代码还是我没有理解 promise 的工作原理?
对于弹出窗口,我选择 AngularUI,代码如下:

 reservationService.book($scope.object, day)
        .then(function(){
            var dialogOpts = {/* dialog options omitted*/}
            return $dialog.dialog(dialogOpts).open();

        })
        .then(function(result){
            console.log('confirmed? ', result);
            if (result){
                //After this line it doesn't do nothing, also if the promise is resolved 
                return reservationService.confirm($scope.object);
            }
        })
        .then(function(){
            //this function is never executed
            $scope.$emit('object:detail',{object: $scope.object});
        });

预订服务:

function confirm(){
     var deferred = $q.defer();
     setTimeout(function(){
          console.log('Confirming');
          deferred.resolve(true)
     }, 500);
     return deferred.promise;
}

已解决setTimeout 更改为 $timeout angular 的服务

【问题讨论】:

    标签: angularjs promise chain


    【解决方案1】:

    使用$timeout 而不是setTimeout,因为它在角度范围内工作在一起,强制digest 阶段(或在setTimeout 内使用$scope.apply())。

    【讨论】:

      【解决方案2】:

      你可以试试

      //skipping the first then
      .then(function(result){
                  var deferred = $q.defer();
                  console.log('confirmed? ', result);
                  if (result){
                      //After this line it doesn't do nothing, also if the promise is resolved 
                      return deferred.resolve(reservationService.confirm($scope.object));
                  }
                  deferred.resolve();
                  return deferred.promise;
              })
      .then(function(){
                      //this function is never executed
                      $scope.$emit('object:detail',{object: $scope.object});
                  });
      

      对于 then 链接,最后一个 then 成功或失败函数应该返回一个 Promise。正如$q documentation 提到的那样

      then(successCallback, errorCallback) – 无论何时承诺 曾经或将要解决或拒绝,然后调用其中一个成功或 一旦结果可用,错误回调异步。这 使用单个参数调用回调:结果或拒绝 原因。

      此方法返回一个新的承诺,该承诺通过以下方式解决或拒绝 successCallback 或 errorCallback 的返回值。

      【讨论】:

      • 以这种方式工作,但它与reservationService工作方式相同......
      • 我没明白你的意思?
      • 我正在编辑帖子...现在看看confirm 方法的实现。它以与您相同的方式实现......但是为什么我必须调用deferred.resolve 传递它从服务返回的promise,当它从setTimeout 解析时?
      • reservationService 返回一个承诺,因此您可以在其上调用then。这个then 再次返回一个由return $dialog.dialog(dialogOpts).open(); 解决的承诺(我认为在内部),因此下一个链接的then 被调用。第二个then 确实返回了 promise,但没有调用来解决它,因此下一个 then 永远不会被执行。
      • 啊不..问题出在setTimeout 上,它不会调用某个角度的相位,事实上,现在我用$timeout 更改了setTimeout,它可以正常工作,用我的代码。 Promise then 方法应该返回一个 promise 而不必 resolve 它。
      猜你喜欢
      • 1970-01-01
      • 2014-08-12
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多