$ q.defer(),然后当时 [英] $q.defer() then of the then

查看:1066
本文介绍了$ q.defer(),然后当时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不明白的返回值然后

的行为

下面的文档 -


  

然后(successCallback,errorCallback,notifyCallback) - 不管
  当承诺是或将得到解决或拒绝,那么调用同一个
  的成功或错误的回调异步只要结果
  可用。回调被称为有一个参数:
  导致或拒绝的理由。


因此​​,让我们试试吧,按照遵循小code节 -

  VAR推迟= $ q.defer();
deferred.reject();
deferred.promise.then(函数(){
        的console.log(第一个resolove);
    },
    功能(){
        的console.log(第一个拒绝);
    }
)。然后(函数(){
    的console.log(第二解析);
    },
    功能(){
        的console.log(第二个拒绝);
    }
);

1)为什么它记录 -

  1日拒绝
第二决心

而不是 -

  1日拒绝
第二次拒绝

2)我有什么改变,使其日志 -

  1日拒绝
第二次拒绝

\r
\r

VAR myAppModule = angular.module('对myApp',[])。\r
控制器('myCtrl',函数($范围,$ Q){\r
变种推迟= $ q.defer();\r
//deferred.resolve();\r
deferred.reject();\r
deferred.promise.then(函数(){\r
的console.log(第一个resolove);\r
},\r
功能(){\r
的console.log(第一个拒绝);\r
}\r
)。然后(函数(){\r
的console.log(第二解析);\r
},\r
功能(){\r
的console.log(第二个拒绝);\r
}\r
);\r
});

\r

&LT;脚本SRC =htt​​ps://ajax.googleapis.com/ajax /libs/angularjs/1.2.20/angular.min.js\"></script>\r
&LT; D​​IV NG-应用=对myApp&GT;\r
&LT; D​​IV NG控制器=myCtrl&GT;&LT; / DIV&GT;\r
&LT; / DIV&GT;

\r

\r
\r


解决方案

您错过了文档的下一行:


  

此方法的返回一个新的承诺的是解决或通过拒绝
  在successCallback的返回值,errorCallback。


如果你想在未来链是出于什么原因了同样的承诺的结果,从处理程序内deferred.promise返回。

  //这将始终触发拒绝回调
deferred.promise.then(函数(){
        的console.log(第一个resolove);
        返回deferred.promise;
    },
    功能(){
        的console.log(第一个拒绝);
        返回deferred.promise;
    }

如果您想返回要么成功/失败的回调,根据第一个结果,返回$ q.when()您的成功里面收益$ q.reject()你的失败里面:

  deferred.promise.then(函数(){
        的console.log(第一个resolove);
        返回$ q.when();
    },
    功能(){
        的console.log(第一个拒绝);
        返回$ q.reject();
    }
)。然后(函数(){
        的console.log(第二解析);
    },
    功能(){
        的console.log(第二个拒绝);
    }
);

I didn't understand the behavior of the return value of then ,

Here its documentation -

then(successCallback, errorCallback, notifyCallback) – regardless of when the promise was or will be resolved or rejected, then calls one of the success or error callbacks asynchronously as soon as the result is available. The callbacks are called with a single argument: the result or rejection reason.

So let's try it , according to the follow little code section -

var deferred = $q.defer();
deferred.reject();
deferred.promise.then(function () {
        console.log("1st resolove");
    },
    function () {
        console.log("1st reject");
    }
).then(function () {
    console.log("2nd resolve");
    },
    function () {
        console.log("2nd reject");
    }
);

1) Why does it log -

1st reject
2nd resolve

instead of -

1st reject
2nd reject

?

2) What do I have to change to make it log -

1st reject
2nd reject

?

var myAppModule = angular.module('myApp', []).
		controller('myCtrl',function($scope,$q){
			var deferred = $q.defer();
			//deferred.resolve();
			deferred.reject();
			deferred.promise.then(function () {
					console.log("1st resolove");
				},
				function () {
					console.log("1st reject");
				}
			).then(function () {
				console.log("2nd resolve");
				},
				function () {
					console.log("2nd reject");
				}
			);
		});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.min.js"></script>
<div ng-app="myApp">
		<div ng-controller="myCtrl"></div>
	</div>	

解决方案

You missed the next line of the docs:

This method returns a new promise which is resolved or rejected via the return value of the successCallback, errorCallback.

If you want the next chain to be the result of the same promise for whatever reason, return deferred.promise from inside your handler.

// This will always trigger the reject callback
deferred.promise.then(function () {
        console.log("1st resolove");
        return deferred.promise;
    },
    function () {
        console.log("1st reject");
        return deferred.promise;
    }
)

If you want to return either the success/failed callback, depending on the result of the first, return $q.when() inside your success and return $q.reject() inside your failure:

deferred.promise.then(function () {
        console.log("1st resolove");
        return $q.when();
    },
    function () {
        console.log("1st reject");
        return $q.reject();
    }
).then(function () {
        console.log("2nd resolve");
    },
    function () {
        console.log("2nd reject");
    }
);

Example

这篇关于$ q.defer(),然后当时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆