done 与 fail 传参给函数
- var searchDfd = id ? $.when(this.idSearch(id, this.catChosen), this.keySearch(keyword, this.catChosen)) : this.keySearch(keyword, this.catChosen);
- searchDfd.done(this.searchSuccess) //注意匿名函数的用法 .fail(this.searchError()); //将参数传给函数执行的返回值 searchSuccess: function() { }, searchError: function() { return function(error) { }; },
原因在于
- $.ajax("test.html").done(function() {
- alert("哈哈,成功了!");
- }).fail(function() {
- alert("出错啦!");
- }).done(function() {
- alert("第二个回调函数!");
- });
- promise always
这个方法用来指定回调函数的,它的作用是,不管调用的是 deferred.resolve() 还是 deferred.reject(),最后总是执行。
- $.when(save, del, update).always(function() {
- console.log('clear cache'); // savedone.resolve(); });
解决两个异步操作的嵌套返回问题
- //错误的使用 function masterRight(choise) { var defer = $.Deferred(); (function() { var defer2 = $.Deferred(); if (choise) { isMaster = "ture"; defer2.resolve(isMaster); } else { isMaster = "false"; defer2.reject(isMaster); } return defer2.promise(); })(); return defer.promise(); } $(window).on('load', function() { var outer = masterRight(1).done(function(isMater) { console.log(isMaster); }); console.log(outer); });
解决方法 1
- getUserData().done(function() {
- masterRight().done(function(permission) {
- isMasterRight(permission).done(function() {
- if (isMaster === true) {} else {}
- });
- }).fail(function(error) {
- console.log(error);
- });
- });
- var dfds = [.Deferred()];
解决方法 2
deferred.promise() 没有参数时,返回一个新的 deferred 对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署 deferred 接口。
- $.when(wait(dtd)).done(function() {
- alert("哈哈,成功了!");
- }).fail(function() {
- alert("出错啦!");
- });或者 //wait函数还是保持不变,我们直接把它传入$.Deferred():$.Deferred(wait).done(function(){ alert("哈哈,成功了!"); }).fail(function(){ alert("出错啦!"); });或者//直接在wait对象上部署deferred接口。dtd.promise(wait);wait.done(function(){ alert("哈哈,成功了!"); }).fail(function(){ alert("出错啦!"); });wait(dtd);
promise 的灵活使用,promise always,def=[def1,def2],when, 以及出现嵌套时可以的解决方法
解决两个异步操作的嵌套返回问题
- //嵌套的使用 function masterRight(choise) { var defer = $.Deferred(); (function() { var defer2 = $.Deferred(); if (choise) { defer2.resolve(isMaster); } else { defer2.reject(isMaster); } return defer2.promise(); })(); return defer.promise(); }
替代方法 1
- getUserData().done(function() {
- masterRight().done(function(permission) {
- isMasterRight(permission).done(function() {
- if (isMaster === true) {
- $("#master_promote_tab").CSS({
- "display": "inline-block"
- });
- self.getMasterPromote().reset();
- self.hideLoading();
- } else {
- $("#master_promote_tab").css({
- "display": "none"
- });
- }
- });
- }).fail(function(error) {
- console.log(error);
- });
- });
- var dfds = [$.Deferred(), $.Deferred()];
查看资料后,替代方法 2
deferred.promise() 没有参数时,返回一个新的 deferred 对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署 deferred 接口。
- $.when(wait(dtd)).done(function(){}).fail(function(){});
或者
- //wait函数还是保持不变,我们直接把它传入$.Deferred():$.Deferred(wait).done(function(){}).fail(function(){});
或者
- //直接在wait对象上部署deferred接口。dtd.promise(wait);wait.done(function(){}).fail(function(){});wait(dtd);
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: