JQuery的异步回调支持 - Promise、Deferred

简介: 1、Deferred对象: 一般在函数内部进行声明,并在运行过程中改变其状态,例如成功或失败,最终返回Promise对象用于状态监听。 主要方法: Deferred.resolve(param...) :执行成功,将会触发Promise对象的done回调方法。

1、Deferred对象:

一般在函数内部进行声明,并在运行过程中改变其状态,例如成功或失败,最终返回Promise对象用于状态监听。

主要方法:

Deferred.resolve(param...) :执行成功,将会触发Promise对象的done回调方法。
Deferred.reject(param...) :执行失败,将会触发Promise对象的fail回调方法。
Deferred.notify(param...) :正在执行,将会触发Promise对象的progress回调方法。
Deferred.promise() :返回Promise对象实例。

其他说明:

使用 $.Deferred() 即可声明一个Deferred对象。

2、Promise对象:

可以将其看作Deferred的一个实例,在函数状态改变时将会触发Promise对象的相应回调方法。

主要方法:

Promise.done(callback) :执行成功时的回调方法。
Promise.fail(callback) :执行失败时的回调方法。
Promise.progress(callback) :正在执行时的回调方法。
Promise.always(callback) :只要Deferred的状态发生改变就会触发always方法,类似于finally。
Promise.then(doneCallback, failCallback, progressCallback) :另外一种定义回调函数的方式。

其他说明:

Promise的所有方法均返回Promise对象,因此可以链式调用,比如:Promise.done(funA).fail(funB).always(funC)
JQuery的Ajax方法默认返回Promise对象,因此可以直接使用Promise的各种回调方法。

3、代码示例:

 1 //-- 全局变量 ---------------------------
 2 var flagA = flagB = flagC = "";
 3 
 4 //-- Fun : waitA ---------------------------
 5 var waitA = function(ms){
 6     if(!ms) ms = 2000;
 7     var def = $.Deferred();
 8     setTimeout( function(){ flagA = "waitA执行成功"; def.resolve(flagA); }, ms);
 9     return def.promise();
10 };
11 //-- Fun : waitB ---------------------------
12 var waitB = function(ms){
13     if(!ms) ms = 2000;
14     var def = $.Deferred();
15     setTimeout( function(){ flagB = "waitB执行失败"; def.reject(flagB); }, ms);
16     return def.promise();
17 };
18 //-- Fun : waitC ---------------------------
19 var waitC = function(ms){
20     if(!ms) ms = 2000;
21     var def = $.Deferred();
22     setTimeout( function(){ flagC = "waitC执行失败"; def.reject(flagC); }, ms);
23     return def.promise();
24 };
25 
26 //-- 调用方式一:
27 waitA(2000).done(function(msg){
28     console.info(msg);
29 }).fail(function(msg){
30     console.info(msg);
31 }).always(function(msg){
32     console.info(msg);
33 });
34 
35 //-- 调用方式二:
36 waitA(2000).then(function(msg){
37     console.info(msg);
38 }, function(msg){
39     console.info(msg);
40 });
41 
42 //--调用方式三:
43 $.when(waitA(2000)).then(function(msg){
44     console.info(msg);
45 }, function(msg){
46     console.info(msg);
47 });
48 
49 //--调用方式四:按顺序执行三个函数
50 $.when(waitA(2000)).then(waitB).then(waitC);
51 //或者:
52 $.when(waitA(2000)).then(function(msg){
53     console.info(msg);
54     waitB(2000).then(function(msg){
55         console.info(msg);
56         waitC(2000).then(function(msg){
57             console.info(msg);
58         });
59     });
60 });
61 
62 //--调用方式五:同时执行三个函数
63 $.when(waitA(1000), waitB(2000), waitC(3000)).then(function(mes){
64     console.info("全部执行成功!" + mes);
65 }, function(mes){
66     console.warn("未全部执行成功,其中:" + mes);
67 });

 


宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒
目录
相关文章
|
6天前
|
前端开发 JavaScript
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
该文章教授了如何使用Promise和async/await来解决异步编程问题,从而避免回调地狱,使代码更加清晰和易于管理。
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
|
3月前
|
前端开发 JavaScript
Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
76 1
|
2月前
|
前端开发 JavaScript
JavaScript——promise 是解决异步问题的方法嘛
JavaScript——promise 是解决异步问题的方法嘛
32 0
|
2月前
|
前端开发 JavaScript
ES6新特性(五):Promise优雅地处理异步
ES6新特性(五):Promise优雅地处理异步
|
4月前
|
前端开发 JavaScript
Promise是JavaScript解决异步问题的构造器,代表未来的不确定值。
【6月更文挑战第27天】Promise是JavaScript解决异步问题的构造器,代表未来的不确定值。它避免了回调地狱,通过链式调用`.then()`和`.catch()`使异步流程清晰。
43 2
|
4月前
|
存储 前端开发 JavaScript
中间件回调和Promise
【6月更文挑战第18天】
23 1
|
3月前
|
前端开发 小程序 API
【微信小程序】使用 Promise、async 和 await 将异步API 改写为同步
【微信小程序】使用 Promise、async 和 await 将异步API 改写为同步
49 0
|
JSON 前端开发 数据格式
MVC验证08-jQuery异步验证
原文:MVC验证08-jQuery异步验证 本文主要体验通过jQuery异步验证。 在很多的教材和案例中,MVC验证都是通过提交表单进行的。通过提交表单,可以很容易获得验证出错信息。因为,无论是客户端验证还是服务端验证,总能找到与Model属性或验证特性对应的html元素和属性,并把错误信息显示出来。
840 0
|
5月前
|
JavaScript
jQuery图片延迟加载插件jQuery.lazyload
jQuery图片延迟加载插件jQuery.lazyload
|
4月前
|
设计模式 JavaScript 前端开发
必知的技术知识:jQuery插件开发精品教程,让你的jQuery提升一个台阶
必知的技术知识:jQuery插件开发精品教程,让你的jQuery提升一个台阶
45 1