Promise

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.立即执行性

[javascript]  view plain  copy
  1. var p=new Promise(function(resolve,reject)(){  
  2.     console.log("create new promise");  
  3.     resolve("success");  
  4. });  
  5.   
  6. console.log("after new  promise");  
  7.   
  8. p.then(function(value){  
  9.     console.log(value);  
  10. });  
  11. //create new promise  
  12. //after new  promise  
  13. //success  

3-2.状态不可逆性、链式调用、

[javascript]  view plain  copy
  1. var p = new Promise(function(resolve, reject){  
  2.   resolve(1);  
  3. });  
  4. p.then(function(value){               //第一个then  
  5.   console.log(value);  
  6.   return value*2;  
  7. }).then(function(value){              //第二个then  
  8.   console.log(value);  
  9. }).then(function(value){              //第三个then  
  10.   console.log(value);  
  11.   return Promise.resolve('resolve');   
  12. }).then(function(value){              //第四个then  
  13.   console.log(value);  
  14.   return Promise.reject('reject');  
  15. }).then(function(value){              //第五个then  
  16.   console.log('resolve: '+ value);  
  17. }, function(err){  
  18.   console.log('reject: ' + err);  
  19. })  
  20. //1  
  21. //2  
  22. //undefined  
  23. //resolve  
  24. //reject: reject  


3-3. then() 回调异步性

[javascript]  view plain  copy
  1. var p = new Promise(function(resolve, reject){  
  2.   resolve("success");  
  3. });  
  4.   
  5. p.then(function(value){  
  6.   console.log(value);  
  7. });  
  8.   
  9. console.log("first");  
  10. //"first"  
  11. //"success"  

4.用法

[javascript]  view plain  copy
  1. function getURL(URL) {  
  2.       return new Promise(function (resolve, reject) {  
  3.           var req = new XMLHttpRequest();  
  4.           req.open('GET', URL, true);  
  5.           req.onload = function () {  
  6.               if (req.status === 200) {  
  7.                   resolve(req.responseText);  
  8.               } else {  
  9.                   reject(new Error(req.statusText));  
  10.               }  
  11.           };  
  12.           req.onerror = function () {  
  13.               reject(new Error(req.statusText));  
  14.           };  
  15.           req.send();  
  16.       });  
  17. }  
  18. // 运行示例  
  19. var URL = "http://httpbin.org/get";  
  20. getURL(URL).then(function onFulfilled(value){  
  21.   console.log(value);  
  22. }).catch(function onRejected(error){  
  23.   console.error(error);  
  24. });  
原文地址:https://blog.csdn.net/qq_29849641/article/details/54970328
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值