ECMAScript6的Promise对象

1. 概念

  Promise对象用于异步(asynchronouss)计算,一个Promise对象代表着一个还未完成,但预期完成的操作。

2. 出现原因:

 1)  如果你需要通过ajax发送多次请求,而每一次请求依赖上一次请求返回的结果作为参数来继续下次的请求,这样的话,就需要这么写代码:

  

  上面的例子,假设请求C需要依赖B返回的数据,那么C需要放在B的success函数里面。同样的,A需要依赖B返回的数据,那么A也需要放在B的success函数里面。假设现在存在很多个请求,请求之前是相互的依赖关系,那么我们需要嵌套很多层,这样的话,代码的可读性就很差,不直观,调试起来也不方便,维护也不方便。

 2)  如果请求C需要依赖A和B的结果,而A,B是互相独立的,没有依赖关系,那么如果使用上面的实现方法,就使得A(B)需要依赖B(A)完成之后才能调用,这样需要更长的等待时间。

  所以,为了处理这种回调函数层层嵌套的问题(又称“回调地狱”),所以Promise就出现了。

3. 语法

  new Promise(function(resolve,reject){

  //操作…

  });

  Promise对象是全局对象,你也可以理解为一个类,创建Promise实例的时候,利用new关键字。其中,resolve和reject两个参数是函数对象。resolve是用于处理执行成功的场景,reject是用在处理执行失败的场景,一旦操作完成就可以调用这两个函数。具体的调用是通过then()方法来绑定操作后的处理程序,具体使用见之后的讲解。

4. 解析

Promise对象的三种状态:

 1)  pending:刚刚创建一个Promise实例的时候,表示初始化状态

 2)  fulfilled:resolve方法调用的时候,表示操作成功

 3)  rejected:reject方法调用的时候,表示操作失败

  pending状态的promise对象既可转换为带着一个成功值的fulfilled 状态,也可变为带着一个失败信息的 rejected 状态。当状态发生转换时,promise.then绑定的方法(函数句柄)就会被调用。(当绑定方法时,如果 promise对象已经处于 fulfilled 或 rejected 状态,那么相应的方法将会被立刻调用, 所以在异步操作的完成情况和它的绑定方法之间不存在竞争条件。)

  

(图片来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise)

5. 属性

  Promise.length:长度属性,其值为1(构造参数的数目)

  Promise。prototype:Promise构造器的原型

6. 方法

 1)  Promise.then()方法:用于绑定处理操作后的处理程序。

  

 2)  Promise.catch()方法:用于处理操作异常后的页面。

  

 3)  then()和catch()综合使用的例子:

  

 4)  层层依赖用Promise处理:

   代码:

 1 let pro = new Promise(function(resolve,reject){
 2                 if(true){
 3                     resolve(‘操作成功‘);//此时resolve函数会返回值
 4                 }
 5                 else{
 6                     reject(‘操作失败‘);
 7                 }
 8             });
 9
10             pro.then(requestA)
11                .then(requestB)
12                .then(requestC)
13                .catch(requestError);
14
15             function requestA(res){
16                 console.log(res);//输出resolve返回的值-->操作成功
17                 console.log("请求A成功");
18                 return "请求A,下一步就是B你了";
19             }
20
21             function requestB(res){
22                 console.log("上一步是"+res);
23                 console.log("请求B成功");
24                 return "请求B,下一步是C你了";
25             }
26
27             function requestC(res){
28                 console.log("上一步是"+res);
29                 console.log("请求C成功");
30             }
31
32             function requestError(){
33                 console.log("请求失败");
34             }

  

  结果:

  

  解析:上面的例子中:先创建一个实例,还声明了4个函数,其中三个是分别代表着请求A、B、C的;有了then方法,按照调用顺序,很直观的完成了三个操作的绑定。并且,如果请求B依赖请求A的结果,那么,可以在请求A的程序用return语句把需要的数据作为参数,传递给下一个请求。

  (图片例子来源微信公众号:“web前端教程”)

 5)  Promise.all()方法:接受一个数组作为参数,数组的元素是Promise实例对象,当参数中的实例对象的状态都为fulfilled时,Promise.all()才会有返回。

  

  解析:pro2先进入成功fulfilled状态,才是Promise.all()还不能进入then方法,等到5s之后,pro1进入成功fulfilled状态,Promise.all()才进入then方法,才输出结果:["实例1操作成功", "实例2操作成功"]

 6)  Promise.race():接受一个数组作为参数,数组的元素是Promise实例对象,当参数中的实例对象有一个状态(无论是fulfilled还是rejected)发生变化的时候,Promise.race()就会进入then方法。

  

7. 原型

 属性:

  Promise.prototype.constructor:返回创建了实例原型的函数.  默认为 Promise 函数

 方法:

  Promise.prototype.catch(onRejected):添加一个否定(rejection) 回调到当前 promise, 返回一个新的promise。如果这个回调被调用,新 promise 将以它的返回值来resolve,否则如果当前promise 进入fulfilled状态,则以当前promise的肯定结果作为新promise的肯定结果.

  Promise.prototype.then(onFulfilled, onRejected):添加肯定和否定回调到当前 promise, 返回一个新的 promise, 将以回调的返回值 来resolve.

8. 例子

 参考的例子:

 1 <div id="log"></div>
 2     <script>
 3         ‘use strict‘;
 4         var promiseCount = 0;
 5         function testPromise() {
 6             var thisPromiseCount = ++promiseCount;
 7             var log = document.getElementById(‘log‘);
 8             log.insertAdjacentHTML(‘beforeend‘, thisPromiseCount + ‘) 开始(同步代码开始)<br/>‘);
 9             // 我们创建一个新的promise: 然后用‘result‘字符串完成这个promise (3秒后)
10             var p1 = new Promise(function (resolve, reject) {
11                 // 完成函数带着完成(resolve)或拒绝(reject)promise的能力被执行
12                 log.insertAdjacentHTML(‘beforeend‘, thisPromiseCount + ‘) Promise开始(异步代码开始)<br/>‘);
13
14                 // 这只是个创建异步完成的示例
15                 window.setTimeout(function () {
16                    // 我们满足(fullfil)了这个promise!
17                    resolve(thisPromiseCount)
18                 }, Math.random() * 2000 + 1000);
19             });
20             // 定义当promise被满足时应做什么
21             p1.then(function (val) {
22                 // 输出一段信息和一个值
23                 log.insertAdjacentHTML(‘beforeend‘, val + ‘) Promise被满足了(异步代码结束)<br/>‘);
24             });
25
26             log.insertAdjacentHTML(‘beforeend‘, thisPromiseCount + ‘) 建立了Promise(同步代码结束)<br/><br/>‘);
27         }
28         testPromise();
29         testPromise();
30         testPromise();

 结果:

  

 另一个比较好的例子:

  https://github.com/mdn/promises-test/blob/gh-pages/index.html

9. 总结

 Promise是一个让开发者更合理、更规范地用于处理异步操作的对象。

10. 参考资料

  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

  https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML

11. 接下来的安排

  ajax源码运用

  结合promise与ajax源码运用

时间: 2024-08-04 09:43:15

ECMAScript6的Promise对象的相关文章

deferred对象和promise对象(一)

个人认为阮一峰老师讲的关于deferred对象是最容易理解的. deferred对象是jquery的回调函数解决方案.解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口. deferred对象的功能: 1.将ajax操作改为链式 对于$.ajax()操作完成之后,如果使用的是低于1.5版本的jquery,返回的是XHR对象,高于1.5版本返回的是deferred对象.deferred对象可进行链式操作. $.ajax({ url:"test.html", su

ES6深入学习记录(二)promise对象相关

1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步的操作)的结果.从语法上说,Pormise是一个对象,从它可以获取异步操作的消息.Promise提供统一的API.各种异步操作都可以用同样的方法进行处理. Promise对象的两个特点: 1.对象的状态不受外界影响.Promis

Promise对象

promise是异步编程的一种解决方案,promise对象代表一个异步操作. promise对象有三种状态:pending(进行中),resolved(已完成)和rejected(已失败),只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态. Promise对象是一个构造函数,用来生成Promise实例. var promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功

ES6 Promise对象

Promise  ,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. Promise 对象有以下两个特点. (1)对象的状态不受外界影响. Promise 对象代表一个异步操作,有三种状态: Pending (进行中). Resolved (已完成,又称 Fulfilled )和 Rejected (已失败).只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态. (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果. Promis

ES6 - promise对象

Promise的设计初衷 我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样: $.ajax({ success:function(res1){ //...请求B开始,B依赖A返回的数据 $.ajax({ sucess:function(res2){ //...请求C开始,C依赖B返回的数据 $.ajax({ sucess:function(res3){ } }); } }); } }); 这种写

浅谈Javascript中Promise对象的实现

https://segmentfault.com/a/1190000000684654 What? Promise是CommonJS的规范之一,拥有resolve.reject.done.fail.then等方法,能够帮助我们控制代码的流程,避免函数的多层嵌套.如今异步在web开发中越来越重要,对于开发人员来说,这种非线性执行的编程会让开发者觉得难以掌控,而Promise可以让我们更好地掌控代码的执行流程,jQuery等流行的js库都已经实现了这个对象,年底即将发布的ES6也将原生实现Promi

ES6 的 Promise 对象

$.ajax({ url: '......', success: function (data) { $.ajax({ // 要在第一个请求成功后才可以执行下一步 url: '......', success: function (data) { // ...... } }); } }); 当执行一些异步操作时,我们需要知道操作是否已经完成,当执行完成的时候会返回一个回调函数,表示操作已经完成. 再继续进行下一个接口请求..... 回调函数的形式在实际的应用当中会有以下的缺点: 在需要多个操作的

ES6的promise对象应该这样用

ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的缺点,而又无法忽略的是也正因为这一点,node.js处理并行的能力被人看作优点,在我看来,这其实有着些讽刺的意味,就好像踢足球时有的人总夸你腿短,所以频率快下盘稳好控球...好在js从出生以来就有一种独特的特质,就是模仿,对,就是模仿,模仿别人的优点来补足自己,同时保持自己的长处. ES6就是通过P

es6中的promise对象

Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resolved(已经完成)和Rejected(已失败) ES6规定,Promise对象是一个构造函数,用来生成Promise实例. var promise=new Promise(function(resove,reject){ if (/* 异步操作成功 */){ resolve(value); } el