1.优点和缺点
可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
2.规范
Promise 对象有三种状态: Pending – Promise对象的初始状态,等到任务的完成或者被拒绝;Resolved – 任务执行完成并且成功的状态;Rejected – 任务执行完成并且失败的状态;
Promise的状态只可能从Pending状态转到Resolved状态或者Rejected状态,而且不能逆向转换,同时Resolved状态和Rejected状态也不能相互转换;
Promise对象必须实现then方法,then是promise规范的核心,而且then方法也必须返回一个Promise对象,同一个Promise对象可以注册多个then方法,并且回调的执行顺序跟它们的注册顺序一致;
then方法接受两个回调函数,它们分别为:成功时的回调和失败时的回调;并且它们分别在:Promise由Pending状态转换到Resolved状态时被调用和在Promise由Pending状态转换到Rejected状态时被调用。
3.特性
3-1.立即执行性
- var p=new Promise(function(resolve,reject)(){
- console.log("create new promise");
- resolve("success");
- });
- console.log("after new promise");
- p.then(function(value){
- console.log(value);
- });
- //create new promise
- //after new promise
- //success
3-2.状态不可逆性、链式调用、
- var p = new Promise(function(resolve, reject){
- resolve(1);
- });
- p.then(function(value){ //第一个then
- console.log(value);
- return value*2;
- }).then(function(value){ //第二个then
- console.log(value);
- }).then(function(value){ //第三个then
- console.log(value);
- return Promise.resolve('resolve');
- }).then(function(value){ //第四个then
- console.log(value);
- return Promise.reject('reject');
- }).then(function(value){ //第五个then
- console.log('resolve: '+ value);
- }, function(err){
- console.log('reject: ' + err);
- })
- //1
- //2
- //undefined
- //resolve
- //reject: reject
- var p = new Promise(function(resolve, reject){
- resolve("success");
- });
- p.then(function(value){
- console.log(value);
- });
- console.log("first");
- //"first"
- //"success"
4.用法
- function getURL(URL) {
- return new Promise(function (resolve, reject) {
- var req = new XMLHttpRequest();
- req.open('GET', URL, true);
- req.onload = function () {
- if (req.status === 200) {
- resolve(req.responseText);
- } else {
- reject(new Error(req.statusText));
- }
- };
- req.onerror = function () {
- reject(new Error(req.statusText));
- };
- req.send();
- });
- }
- // 运行示例
- var URL = "http://httpbin.org/get";
- getURL(URL).then(function onFulfilled(value){
- console.log(value);
- }).catch(function onRejected(error){
- console.error(error);
- });