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 });

 


宠辱不惊,看庭前花开花落;去留无意,望天上云卷云舒
目录
相关文章
|
2月前
|
前端开发 JavaScript UED
深入了解JavaScript异步编程:回调、Promise与async/await
【10月更文挑战第11天】深入了解JavaScript异步编程:回调、Promise与async/await
20 0
|
3月前
|
前端开发 JavaScript
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
该文章教授了如何使用Promise和async/await来解决异步编程问题,从而避免回调地狱,使代码更加清晰和易于管理。
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
|
4月前
|
存储 JavaScript 前端开发
关于Django使用Jquery异步刷新
使用Django与jQuery结合实现异步刷新功能,不仅可以提升用户体验,还能提高应用的性能。通过上述的步骤,你可以在自己的Django项目中实现类似的异步数据更新功能。这种技术的关键是理解AJAX的工作原理,以及如何在Django后端创建响应AJAX请求的视图。通过实践这些技巧,你将能够创建更为动态和交互式的Web应用。
34 2
|
6月前
|
存储 前端开发 JavaScript
中间件回调和Promise
【6月更文挑战第18天】
36 1
|
7月前
|
前端开发 JavaScript
js开发:请解释Promise是什么,以及它如何解决回调地狱(callback hell)问题。
Promise是JavaScript解决异步操作回调地狱的工具,代表未来可能完成的值。传统的回调函数嵌套导致代码难以维护,而Promise通过链式调用`.then()`和`.catch()`使异步流程清晰扁平。每个异步操作封装为Promise,成功时`.then()`传递结果,出错时`.catch()`捕获异常。ES6的`async/await`进一步简化Promise的使用,使异步代码更接近同步风格。
93 1
|
7月前
|
前端开发 JavaScript
用原生JavaScript(ES5)来实现Promise的等效功能(异步回调)
用原生JavaScript(ES5)来实现Promise的等效功能(异步回调)
|
JavaScript
JQuery 方法回调$callback
JQuery 方法回调$callback
41 0
|
前端开发 API
19 # promisify:将回调方法 promise 化
19 # promisify:将回调方法 promise 化
43 0
|
JavaScript 前端开发
jquery动画效果之回调
jquery动画效果之回调
59 0
|
前端开发 小程序 Java
小程序不同页面的异步回调,callback和promise的使用讲解
小程序不同页面的异步回调,callback和promise的使用讲解
204 0

相关课程

更多