ajax操作链式写法
$.ajax({
url: "test.html",
success: function () {
// console.log();
},
error: function () {
// console.log();
}
});
还可以这样写
$.ajax("test.html")
.done(function () {console.log(); })
.fail(function () { console.log(); })
还可以不断累加done的函数 按顺序执行
利用when 可以为多个事件指定一个回调函数
$.when($.ajax('test1.html'), $.ajax('test2.html'))
.done(function () {console.log() })
.fail(function () {console.log() });
将deferred推广至所有的函数中
$.when(wait())
.done(function () {console.log(); })
.fail(function () {console.log(); })
when里面的参数必须是deferred对象 wait()函数可以这样写
var dtd = $.Deferred(); // 新建一个deferred对象
var wait = function (dtd) {
var tasks = function () {
console.log();
dtd.resolve(); //改变deferred对象的执行状态
};
setTimeout(tasks, 5000);
return dtd;
}
$.when(wait (dtd))
.done(function () {})
.fail(function () {});
"执行环境" deferred对象有三种执行状态 ---未完成,已完成,已失败
如果执行状态是“已完成”(resolved), deferred对象立即调用done()方法指定的回调函数,
如果执行状态是“已失败”(reject),调用fail()方法指定的回调函数;
如果执行状态是“未完成”,则继续等待,或者调用progress()方法指定的回调函数
// 备注 感觉有点像观察者模式
缺陷:
dtd是全局变量,所以dtd中的状态可以从外部被改变,引进deferred.promise()方法 来改变这一缺陷
promise的作用是在原来的deferred对象上返回另一个deferred对象,后者只开放与改变执行状态无关的方法,比如done和fail,屏蔽与改变执行状态有关的方法,从而使得执行状态不能被改变
var dtd = $. Deferred(); // 新建一个Deferred对象
var wait = function (dtd) {
var tasks = function () {
console.log();
dtd.resolve(); // 改变Deferred对象的执行状态
};
setTimeout(tasks, 5000);
return dtd.promise();
};
var d = wait(dtd);
$.when(d)
.done(function () {console.log(); })
.fail(function () {console.log(); });
d.resolve(); // 此时这个语句是无效的
一种更好的办法就是不让dtd是全局变量,在wait函数内部定义 deferred对象
一种更加简便的方式是直接将wait函数传入$.Deferred()中 (是传入一个函数名)
$.Deferred(wait)
.done(function () { })
.fail(function () { });
还可以直接在wait对象上部署deferred接口
var dtd = $.Deferred();
var wait = function (dtd) {
var tasks = function () {
console.log();
dtd.resolve();
}
setTimeout(tasks, 5000);
};
dtd.promise(wait); // 可以给wait函数直接绑定一个deferred接口
wait.done(function() {})
.fail(function () {});
wait(dtd);
网友评论