5

我的应用程序应该打开一个弹出窗口,向用户询问确认,然后进行 ajax cal 并关闭弹出窗口。我尝试使用承诺
链来做到这一点(我已经使用过它,我记得它应该以这种方式工作),但它似乎在调用. 现在它是一个用and实现的假服务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通过angular$timeout的服务解决了 变化

4

2 回答 2

6

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

于 2013-09-03T13:38:15.543 回答
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 文档中提到的

then(successCallback, errorCallback) - 无论承诺何时被解决或被拒绝,只要结果可用,就会异步调用成功或错误回调之一。使用单个参数调用回调:结果或拒绝原因。

此方法返回一个新的 Promise,该 Promise 通过 successCallback 或 errorCallback 的返回值解决或拒绝。

于 2013-08-28T10:25:34.067 回答