JQuery的异步回调支持 - Promise、Deferred
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、代码示例:
//-- 全局变量 ---------------------------
var flagA = flagB = flagC = ""; //-- Fun : waitA ---------------------------
var waitA = function(ms){
if(!ms) ms = 2000;
var def = $.Deferred();
setTimeout( function(){ flagA = "waitA执行成功"; def.resolve(flagA); }, ms);
return def.promise();
};
//-- Fun : waitB ---------------------------
var waitB = function(ms){
if(!ms) ms = 2000;
var def = $.Deferred();
setTimeout( function(){ flagB = "waitB执行失败"; def.reject(flagB); }, ms);
return def.promise();
};
//-- Fun : waitC ---------------------------
var waitC = function(ms){
if(!ms) ms = 2000;
var def = $.Deferred();
setTimeout( function(){ flagC = "waitC执行失败"; def.reject(flagC); }, ms);
return def.promise();
}; //-- 调用方式一:
waitA(2000).done(function(msg){
console.info(msg);
}).fail(function(msg){
console.info(msg);
}).always(function(msg){
console.info(msg);
}); //-- 调用方式二:
waitA(2000).then(function(msg){
console.info(msg);
}, function(msg){
console.info(msg);
}); //--调用方式三:
$.when(waitA(2000)).then(function(msg){
console.info(msg);
}, function(msg){
console.info(msg);
}); //--调用方式四:按顺序执行三个函数
$.when(waitA(2000)).then(waitB).then(waitC);
//或者:
$.when(waitA(2000)).then(function(msg){
console.info(msg);
waitB(2000).then(function(msg){
console.info(msg);
waitC(2000).then(function(msg){
console.info(msg);
});
});
}); //--调用方式五:同时执行三个函数
$.when(waitA(1000), waitB(2000), waitC(3000)).then(function(mes){
console.info("全部执行成功!" + mes);
}, function(mes){
console.warn("未全部执行成功,其中:" + mes);
});
JQuery的异步回调支持 - Promise、Deferred的更多相关文章
- jquery.Deferred promise解决异步回调
我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越 ...
- 异步编程Promise/Deferred、多线程WebWorker
长期以来JS都是以单线程的模式运行的,而JS又通常应用在操作用户界面和网络请求这些任务上.操作用户界面时不能进行耗时较长的操作否则会导致界面卡死,而网络请求和动画等就是耗时较长的操作.所以在JS中经常 ...
- based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较 gevent不是异步 协程原理 占位符 placeholder (Future, Promise, Deferred) 循环引擎 greenlet 没有显式调度的微线程,换言之 协程
gevent GitHub - gevent/gevent: Coroutine-based concurrency library for Python https://github.com/gev ...
- js异步回调Async/Await与Promise区别 新学习使用Async/Await
Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...
- 【javascript】异步编年史,从“纯回调”到Promise
异步和分块——程序的分块执行 一开始学习javascript的时候, 我对异步的概念一脸懵逼, 因为当时百度了很多文章,但很多各种文章不负责任的把笼统的描述混杂在一起,让我对这个 JS中的重要概念 ...
- 使用Promise链式调用解决多个异步回调的问题
使用Promise链式调用解决多个异步回调的问题 比如我们平常经常遇到的一种情况: 网站中需要先获取用户名,然后再根据用户名去获取用户信息.这里获取用户名getUserName()和获取用户信息get ...
- 异步编程实现技术:回调、promise、协程序?
异步编程实现技术:回调.promise.协程序?
- 深入浅出写一个多级异步回调从基础到Promise实现的Demo
今天一时兴起,写了一个渐进升级的异步调用demo,记录一下. 1. 最基础的同步调用 //需求:f2在f1之后执行,且依赖f1的返回值.如下: function f1(){ var s="1 ...
- JavaScript及其异步实现续:Promise让一切更简单
在写这篇文章之前,我参考了以下文章.所以我文中的例子都是精准的,而且有循可依.下面抛出例子的链接: Understanding JQuery.Deferred and Promise Deferred ...
随机推荐
- step1: python & scrapy安装
#首先安装python,这里安装python所需依赖包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-dev ...
- Go在windows10 64位上安装
一.安装 1.下载安装包http://www.golangtc.com/download,这是国内的地址,也直接去官网下载. 2.选择适合自己的版本,这里我选择安64位装版go1.9.2.window ...
- Firebird Internal Function
火鸟自定义内置函数,方便.强大. 特点:只可以返回单值,不能返回多行. 若想返回多行table,可以定义存储过程 Procedure,用suspend返回. 自定义内置函数,示例:返回当前批次号. c ...
- [转]How can I install the VS2017 version of msbuild on a build server without installing the IDE?
本文转自:http://stackoverflow.com/questions/42696948/how-can-i-install-the-vs2017-version-of-msbuild-on- ...
- openlayers 各种图层,持续更新
/*高德地图*/ var vectorLayerLine = new ol.layer.Tile({ source: new ol.source.XYZ({ urls: [ "http:// ...
- [android] 天气app布局练习
主要练习一下RelativeLayout和LinearLayout <RelativeLayout xmlns:android="http://schemas.android.com/ ...
- SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心
目录 1.环境介绍 2.配置中心 2.1 创建工程 2.2 修改配置文件 2.3 在github中加入配置文件 2.3 修改启动文件 3. 访问配置中心 1.环境介绍 上一篇文章中,我们介绍了如何利用 ...
- jQuery filter() , end()
1. jquery filter(condition) : 过滤指定对象中符合条件的元素: 2. jquery end() : 回到原来的操作对象 3. example : <body& ...
- Java Jsp使用
1.Jsp基础 1)Jsp的执行过程 tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法 tomcat的wor ...
- 1-2 Sass安装(windows版)
在 Windows 平台下安装 Ruby 需要先有 Ruby 安装包,大家可以到 Ruby 的官网(http://rubyinstaller.org/downloads)下载对应需要的 Ruby 版本 ...