异步编程——promise
异步编程——promise
定义
Promise是异步编程的一个解决方案,相比传统的解决方法——回调函数,使用Promise更为合理和强大,避免了回调函数之间的层层嵌套,也使得代码结构更为清晰,便于维护。Promise 是一个对象,从他可以获取异步操作的消息,他也是一个容器,里面包含着事件结束之后要进行的操作。
特点
Promise对象有两个特点:
- 对象的状态不收外界干扰。Promise对象有三种状态:
pending
(进行中)、resolved
(已完成)、rejected
(已失败),具体处于哪一种状态是由异步操作的结果来决定的,其他的任何操作都无法改变这个状态。 - 一旦状态改变了,就不会再有其他的改变了,任何时候都能得到这个结果。Promise对象状态的改变有两种:1>.pending状态到resolved状态;2>.pending状态到rejected状态;
用法
Promise是一个构造函数,生成一个实例。
var promise = new Promise(function(resolve,reject){
if(/异步成功/){
resolve(val);
}else{
reject(val);
}
});
promise.then(function(val){
/成功后执行的函数/
},function(error){
/失败后执行的函数/
});
Promise构造函数接收一个函数作为参数,这个函数有两个参数resolve、reject,这两个参数也是两个函数,有javascript引擎提供,不需要自己实现。其中,resolve函数的作用是将Promise对象的状态由"进行中"变为"已完成",在异步操作成功的时候调用,并将异步操作的结果以参数的形式传出,就是上例中的val
。reject函数的作用是将Promise对象的状态由"进行中"变为"已失败",在异步操作失败的时候调用,并将操作失败的错误已参数的形式传出。
Promise的实例可以调用then
方法,then
方法有两个函数作为参数,第一个函数是Promise对象状态变为resoloved时执行的函数,第二个函数是Promise对象状态变为rejected时执行的函数,第二个参数是可选的。
一个典型的例子:异步读取文件
function readFileFn(filename){
return new Promise(function(resolve,reject){
fs.readfile(filename,function(err,data){
if(err){
reject(err);
}else{
resolve(data);
}
});
});
}
readFileFn("./test.txt").then(function(data){
console.log(data.toString());
//其他操作...
},function(err){
console.log(err);
});
then
方法可以采用链式的写法,即:
promise.then(...).then(...).then(..)
具体的例子:
var promise = new Promse(function(resolve,reject){
resolve(1); //将Promise对象的状态改为resolved,并传递参数1
});
promise.then(function(val){
console.log(val); // 1
return val*3;
}).then(function(val){
console.log(val); //3
return val*3;
}).then(function(val){
console.log(val); //9
});
Promise对象的一些其他方法
- Promise.prototype.catch:用于指定发生错误时的回调函数,通常的用法是在
then
方法里省略第二个参数,然后在链式调用的尾部使用catch
方法来捕获异步操作或者then
方法中的错误;
readFileFn("./test.txt").then(function(data){
console.log(data.toString());
//其他操作...
}).catch(function(err){
console.log(err);
})
//另一种用法
var promise = new Promise(function(resolve,reject){
reject(new Error("test"));
});
promise.then(function(val){
//...
}).catch(function(err){
console.log(err);
//..
});
- Promise.all():次方法用于将多个Promise实例包装成一个新的Promise实例。Promise.all()方法接收一个数组作为参数:
var p = Promise.all([a,b,c]); //a,b,c都是Promise的实例
p最终的状态由a,b,c三者决定:
1>.当a,b,c的状态都是resolved时,p的状态才是resolved,此时a,b,c的返回值组成一个数组,传给p的回调函数。
2>.只要 a,b,c中有一个状态时reject,p的状态就是reject,此时一个reject的实例的返回值会传递给p的回调函数。
var promises = [1,2,3,4].map(function(id){
return readFileFn("./test"+id+".txt"); //readFileFn()是上面声明过的函数
});
Promise.all(promises).then(function(val){
//...
}).catch(function(err){
//...
});
- Promise.race():同样是将多个Promise实例包装成一个新的Promise实例,与Promise.all()方法类似;
- Promise.resolve():将一个非Promise对象转换为一个Promise对象,
var promise = Promise.resolve($.ajax("./test.txt"));
Promise.resolve()有四种类型的参数:
1>.Promise实例,那么函数不会对参数做任何修改,原样返回;
2>.普通对象,如同上例,会转换成一个promise对象返回;
3>.非对象,即普通的变量,比如"hello"、2 等等,此时会返回一个新的Promise实例,状态为resolved(),"hello"会以参数的形式传给
then
的第一个方法;
var p = Promise.resolve("hello");
p.then(function(val){ //此函数会立即执行
console.log(val); //hello
});
4>.不带参数,会直接返回一个Resolved状态的Promise对象。
- Promise.reject():返回一个状态为rejected的实例,参数类似于Promise.resolve()方法的第三种参数。
- done():Promise内部的错误不会冒泡到全局,所以,如果回调链的最后一个出现错误,就无法被捕获,所以有了
done()
方法,位于回调链的最尾端,用于捕获错误。
promise.then(function(){}).then(function(){}).catch(function(){}).done();
- finally():指定不管Promise最后的状态如何都会执行的操作,他与
done()
的区别是可以接受一个普通的回调函数作为参数,且该函数一定会执行。
异步编程——promise的更多相关文章
- 简单实现异步编程promise模式
本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多 ...
- 异步编程Promise/Deferred、多线程WebWorker
长期以来JS都是以单线程的模式运行的,而JS又通常应用在操作用户界面和网络请求这些任务上.操作用户界面时不能进行耗时较长的操作否则会导致界面卡死,而网络请求和动画等就是耗时较长的操作.所以在JS中经常 ...
- 简述异步编程&Promise&异步函数
前言:文章由本人在学习之余总结巩固思路,不足之前还请指出. 一.异步编程 首先我们先简单来回顾一下同步API和异步API的概念 1.同步API:只有当前的API执行完成之前,才会执行下一个API 例: ...
- 异步编程promise
异步编程发展 异步编程经历了 callback.promise.async/await.generator四个阶段,其中promise和async/await使用最为频繁,而generator因为语法 ...
- AnjularJS异步编程 Promise和$q
Promise,是一种异步处理模式. js代码的函数嵌套会使得程序执行异步代码时很难调试.因为多重嵌套的函数无法确定何时触发回调. 如: funA(arg1,arg2,function(){ func ...
- es6异步编程 Promise 讲解 --------各个优点缺点总结
//引入模块 let fs=require('fs'); //异步读文件方法,但是同步执行 function read(url) { //new Promise 需要传入一个executor 执行器 ...
- 你所必须掌握的三种异步编程方法callbacks,listeners,promise
目录: 前言 Callbacks Listeners Promise 前言 coder都知道,javascript语言运行环境是单线程的,这意味着任何两行代码都不能同时运行.多任务同时进行时,实质上形 ...
- JavaScript异步编程 ( 一 )
1. 异步编程 Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须 ...
- JavaScript异步编程(1)- ECMAScript 6的Promise对象
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
随机推荐
- Windows File 管理工具:junction And Subinacl
junction.exe 是 Sysinternals 出品的命令行工具.使用前建议将其复制到%SystemRoot%/system32目录下 创建一个名为 D:/LINK 的[junction ...
- 转!!java中File的delete()方法删除文件失败的原因
一般来说 java file.delete失败 有以下几个原因 1.看看是否被别的进程引用,手工删除试试(删除不了就是被别的进程占用)2.file是文件夹 并且不为空,有别的文件夹或文件, 3.极有可 ...
- 安装指定版本的Ionic或Cordova(转载)
安装ionic 及 cordova npm install -g cordova ionic 更新命令 npm update -g cordova ionic 安装特定版本 npm install - ...
- 注册tomcat为windows服务(转载)
第一部分 应用场景 需要服务器上Tomcat不显示启动窗口 需要服务器上Tomcat开机自启动 ... 第二部分 配置过程 一.修改配置文件 1 {Tomcat_HOME}/bin/service.b ...
- RTSP服务端转发服务(live555库中的testH264VideoStreamer.cpp和testOnDemandRTSPServer.cpp实例)
1.h264文件的推送 testH264VideoStreamer.cpp文件的开头就定义了 char const* inputFileName = "test.264"; 后面接 ...
- HTML中的SEO和HTML语义化
SEO 1) <title>网站SEO标题</title>, 百度搜索出来的记录, 其标题基本就提取至网站的title, 标签, 因此标题起的好, 不论对点击率还是SEO都至关 ...
- beego——高级查询
ORM以QuerySeter来组织查询,每个返回QuerySeter的方法都会获得一个新的QuerySeter对象. 基本使用方法: o := orm.NewOrm() // 获取 QuerySete ...
- Java集合(2):LinkedList
一.LinkedList介绍 LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的.基于链表也决定了它在随机访问 ...
- 在 ReportViewer 报表中使用表达式
from:http://www.cnblogs.com/jobin/articles/1152213.html 有些表达式在报表中很常用.其中包括更改报表中的数据外观的表达式.计算总数的表达式和更改报 ...
- nodejs入门-静态文件服务器
本文展示是基于node.js的静态文件服务器,代码参考自这里,主要是练习node http.文件模块的使用,另外,对理解http协议也很有帮助除了实现了基本的路由控制,还实现了MIME类型.304缓存 ...