5

ポップアップを開いてユーザーに確認を求めるアプリケーションを作成してから、ajax cal を作成してポップアップを閉じます。私は約束
の連鎖を使ってそれをやろうとしました(私はすでにそれを使っていて、このように動作するはずだと覚えています). 今では、プロミスを返すだけのandで実装された偽のサービスです(将来的には ajax 呼び出しを行います)。これは有効なコードですか、それとも約束の仕組みを理解していませんか? ポップアップには AngularUI を選択し、コードは次のとおりです。 reservationService.confirm($scope.object);setTimeout$q

 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;
}

angularのサービスによる解決setTimeout済みの 変更$timeout

4

2 に答える 2

6

角度スコープで一緒に動作するため、フェーズを強制する (または内で使用する)$timeout代わりに使用されます。setTimeoutdigest$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});
            });

連鎖の場合、最後に成功または失敗した関数は promise を返す必要があります。$q ドキュメントが言及しているように

then(successCallback, errorCallback) – Promise がいつ解決または拒否されたかに関係なく、結果が利用可能になるとすぐに成功またはエラー コールバックのいずれかを非同期に呼び出します。コールバックは、単一の引数 (結果または拒否理由) で呼び出されます。

このメソッドは、successCallback または errorCallback の戻り値を介して解決または拒否される新しい promise を返します。

于 2013-08-28T10:25:34.067 に答える