Deferred是JQuery的一个延迟对象,意思是函数延迟到某个点才开始执行,改变执行状态的方法有两个(成功:resolve和失败:reject),分别对应两种执行回调(成功回调函数:done和失败回调函数:fail) 某些耗时比较长的javascript操作A方法,比如ajax读取服务器数据,不是立即返回结果的,而javascript操作B方法必须等A操作完成才能执行(或者需要用到A方法的返回结果),此时Deferred就派上用场了。
Deferred是一种将异步处理串联书写并执行的机制,Deferred对象是一种具有unresolved,resolved,rejected中某一种状态的对象。Deferred内部机制是先注册回调函数,Deferred对象状态发生变化时执行该函数,是一种提高代码可读性的机制。
Deferred对象的状态迁移只能发生一次,以then()、done()、fail()、always()、pipe()指定后续函数的方法,通过when()来并行处理,将Deferred对象中的一部分方法删除后得到是Promise对象,对状态的管理由最初创建该Deferred对象的所有者来执行。
function A(url, param, method) {
var asycRs = $.Deferred();
if (null != method && '' != method) {
if ('post' === method.toLowerCase()) {
$.post(url, param, function (data) {
asycRs.resolve(data)
});
}
if ('get' === method.toLowerCase()) {
$.get(url, param, function (data) {
asycRs.resolve(data)
});
}
} else {
// TODO 默认get方式请求
$.get(url, param, function (data) {
asycRs.resolve(data)
});
}
return asycRs;
}
function B(data) {
console.log(data); // TODO data为异步操作A方法完成,返回的结果
);
$.when(A(url, param, 'post')).done(function (data) {
B(data); // TODO 异步操作A方法完成,返回data给B方法执行
});