经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
介绍下promise的特性,优缺点,内部如何实现的,动手实现一个promise (一) - 张胖胖-007
来源:cnblogs  作者:张胖胖-007  时间:2020/11/16 10:25:11  对本文有异议

1.Promise 基本特性

  • 1. Promise有三种状态:pending(进行中),fulfilled(resolve)(已成功),reject(已失败).
  • 2. Promise对象接受一个回调函数作为参数,该回调函数接受两个参数,分别是成功时的回调resolve和失败时的回调reject;另外resolve的参数除了正常值以外还可能时一个promise对象的实例;reject的参数通常时一个error对象的实例;
  • 3 then方法放回一个新的Promise实例,并接收两个参数onResolve(fulfilled状态的回调);onRejected(reject状态的回调,该参数可选)
  • 4.catch方法返回一个新的promise实例
  • 5. finally方法不管Promise状态如何都会执行,该方法的回调函数不接受任何参数。
  • 6. Promise。all()方法将多个Promise实例,包装成一个新的Promise实例,该方法接受一个由promise对象组成的数组作为参数(Promise.all方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是promise实例),注意参数中只要有一个实例触发catch,都会触发,Promise.all方法返回的新catch方法,如果参数中的某个实例本身调用了catch方法,将不会触发Promise.all放回的新实例的catch方法。
  • 7. Promise.race()方法的参数与Promise.all方法一样,参数中的实例只要有一个率先改变状态就会将该实例的状态传给Promise.race方法,并将返回值作为Promise。race()方法产生的Promise实例的放回值。
  • 8.Promise.resolve()将现有对象转为Promise对象,如果该方法的参数为一个Promise对象,Promise.resolve将不做任何处理;如果将参数thenable对象(即具有then方法),Promise.resolve()将该对象转换为Promise对象并立即执行then方法,如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的Promise对象,状态为fulfilled,其参数将会将会作为then方法中onresolved回调函数的参数,如果Promise。resolve方法不带参数,会直接放回一个fulfilled的状态的Promise对象。需要注意的是,立即resolve()的promise对象,是在本轮“事件循环”,(event loop)的结束时执行,而不是在下一轮“事件循环中”的开始时。
  • 9. Promise.reject()同样放回一个新的promise对象,状态为rejected,无论传入任何参数都将作为reject()的参数。

2)Promise优点

  • 1.统一异步api
  • Promise的一个重要有优点是它将逐渐被用作浏览器的异步API,统一现在各种各样的API,以及不兼容的模式和手法。
  • 2.Promise 与事件对比
  • 和事件相比较,Promise更适合处理一次性的结果,在结果计算出来之前或之后注册回调函数都是可以的,都可以拿到正确的值,Promise的这个优点和自然,但是,不能使用Promise处理多次触发事件,链式处理Promise的有一有点,但是事件却不能这样链式处理
  • 3.Promise 与回调对比。
  •   解决了回调地狱的问题,将异步操作以同步操作的流程表达出来
  • 4.Promise带来的额外好处时包含了更好的错误处理方式(包含已成处理),并且写起来很轻松(以为可以宠用一些同步的工具比如Array.prototype.map()).

3)Promise 缺点

  • 1.无法取消Promise,一旦新建他就会立即执行,无法中途取消
  • 2.如果不设置回调函数,Promise内部抛出的错误,不会放映到外部 。
  • 3.当处于Pending状态时,无法得知promise进展到哪一个阶段(刚刚开始还是即将完成)
  • 4.Promise真正执行回调的时候,定义Promise那部分实际上已经走完了,所以Promise的报错堆栈上下午不太友好

4.简单代码实现Promise有7个主要的属性state(状态),value(成功放回值),reason(错误信息),resolve方法,reject方法,then方法。

  1. //1.实际Promise
  2. //new Promise((resolve,reject)=>{ resolve("zhangpanpan")}))
  3. //实现简易版Promise
  4. class MyPromise {
  5. constructor(exccutor) {
  6. this.state = "pending"; //当前执行的状态
  7. this.value; //正确或错误情况下的放回值
  8. //resolvue 保存正确情况下的返回值
  9. let resolvue = value => {
  10. if (this.state === "pending") {
  11. this.state = "fulfilled";
  12. this.value = value;
  13. }
  14. }
  15. //reject 情况执行 的函数
  16. let reject = value => {
  17. if (this.state === "pending") {
  18. this.state = "rejected";
  19. this.value = value;
  20. }
  21. }
  22. try {
  23. exccutor(resolvue, reject)
  24. } catch (error) {
  25. reject(error)
  26. }
  27. }
  28. then(onfulfilled, onJected) {
  29. if (this.state === "rejected") {
  30. onJected(this.value)
  31. }
  32. if(this.state === "fulfilled"){
  33. onfulfilled(this.value)
  34. }
  35. }
  36. }
  37. let mypromise=new MyPromise((res,rej)=>{
  38. res("ddd")
  39. });
  40. mypromise.then(e=>{
  41. console.log(e);
  42. })

 

原文链接:http://www.cnblogs.com/James-net/p/13958533.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号