资讯专栏INFORMATION COLUMN

Promise理解与实现

hlcc / 2942人阅读

摘要:对象设置初始状态默认为等待状态用数组来保存成功函数设置为成功状态设置为失败状态调用回调函数增加方法根据状态执行成功失败方法执行成功方法执行失败方法将成功失败方法保存在数组里

promise理解

promise的意思是承诺。承诺理解为某个时候一些条件满足后,会兑现一件事情。

</>复制代码

  1. //为了方便理解我编一个小故事
  2. //先假装我有一个女朋友
  3. //她承诺如果她爸妈不回来就给我就可以去帮她修电脑 否则...
  4. let promise = new Promise(function (success,fail) {
  5. //她说三秒后会告诉我今晚爸妈回不回来
  6. let herParentBack = Math.random() > 0.5 ? true : false;
  7. setTimeout(function(){
  8. if(herParentBack){
  9. success("我马上过来来帮你修你电脑");
  10. }else{
  11. fail("你要早点休息");
  12. }
  13. },3000);
  14. });
  15. //第一个函数接收sucess函数传来的成功信息
  16. //第二个函数接收fail函数传来的失败信息
  17. promise.then(function (sucessMsg) {
  18. console.log(sucessMsg);
  19. },function (fail) {
  20. console.log(failMsg);
  21. })
  22. //我马上过来帮你修电脑

new Promise会传入一个回调函数,会伴着对象创建被立即调用。
这个function是承诺的主体内容。一般我们会做一些判断或者异步请求。(在这里要等女友回消息,我想好怎么回答她。)

promise.then方法在promise执行了success或fail后会执行对应的成功失败方法。 (这里理解为吧想好告诉她)

promise实现

根据promis规范promise Promise/A

Promise设置了三个状态,"pending"、"resolved"、"rejected"。

</>复制代码

  1. //Promise对象设置初始状态
  2. function Promise(callback) {
  3. var self = this;
  4. //默认为等待状态
  5. self.status = "pending";
  6. self.value = undefined;
  7. self.reason = undefined;
  8. //用数组来保存成功函数
  9. self.onResolvedCallBacks = [];
  10. self.onRejectedCallbacks = [];
  11. function resolve(value){
  12. if(self.status === "pending"){
  13. //设置为成功状态
  14. self.status = "resolved";
  15. self.value = value;
  16. self.onResolvedCallBacks.forEach(item=>item(self.value));
  17. }
  18. }
  19. function reject(reason) {
  20. if(self.status === "pending"){
  21. //设置为失败状态
  22. self.status = "rejected";
  23. self.reason = reason;
  24. self.onRejectedCallbacks.forEach(item=>item(self.reason));
  25. }
  26. }
  27. callback(resolve,reject);
  28. //调用Promise回调函数
  29. }
  30. module.exports = Promise;

增加Promise.then方法

</>复制代码

  1. //根据Promise状态执行成功失败方法
  2. Promise.prototype.then = function (onFulfilled,onRejected) {
  3. let self = this;
  4. onFulfilled = typeof onFulfilled == "function"?onFulfilled:function(value){return value};
  5. onReject = typeof onReject=="function"?onReject:function(reason){throw reason;}
  6. if(self.status === "resolved"){
  7. return new Promise(function (resolve,reject) {
  8. try {
  9. let x = onFullFilled(self.value);
  10. if(x instanceof Promise){
  11. x.then(resolve,reject);
  12. }else{
  13. resolve(x);
  14. }
  15. }
  16. catch(e) {
  17. reject(e);
  18. }
  19. })
  20. //执行成功方法
  21. }else if(self.status == "rejected"){
  22. return new Promise(function (resolve,reject) {
  23. try {
  24. let x = onRejected(self.reason);
  25. if(x instanceof Promise){
  26. x.then(resolve,reject);
  27. }else{
  28. resolve(x);
  29. }
  30. }
  31. catch(e) {
  32. reject(e)
  33. }
  34. })
  35. //执行失败方法
  36. }
  37. if(self.status === "pending"){
  38. return new Promise(function (reslove,reject) {
  39. self.onResolvedCallBacks.push(function () {
  40. let x = onFullFilled(self.value);
  41. if(x instanceof Promise){
  42. x.then(resolve,reject);
  43. }else{
  44. resolve(x);
  45. }
  46. })
  47. self.onRejectedCallbacks.push(function () {
  48. let x = onRejected(self.reason);
  49. if(x instanceof Promise){
  50. x.then(resolve,reject);
  51. }else{
  52. resolve(x);
  53. }
  54. })
  55. })
  56. //将成功失败方法保存在数组里
  57. }
  58. }

Promise.all

</>复制代码

  1. Promise.all = all;
  2. function all(iterable) {
  3. var self = this;
  4. if (!isArray(iterable)) {
  5. return this.reject(new TypeError("must be an array"));
  6. }
  7. var len = iterable.length;
  8. var called = false;
  9. if (!len) {
  10. return this.resolve([]);
  11. }
  12. var values = new Array(len);
  13. var resolved = 0;
  14. var i = -1;
  15. var promise = new this(INTERNAL);
  16. while (++i < len) {
  17. allResolver(iterable[i], i);
  18. }
  19. return promise;
  20. function allResolver(value, i) {
  21. self.resolve(value).then(resolveFromAll, function (error) {
  22. if (!called) {
  23. called = true;
  24. doReject(promise, error);
  25. }
  26. });
  27. function resolveFromAll(outValue) {
  28. values[i] = outValue;
  29. if (++resolved === len && !called) {
  30. called = true;
  31. doResolve(promise, values);
  32. }
  33. }
  34. }
  35. }

Promise.race

</>复制代码

  1. Promise.race = function(iterable) {
  2. var self = this;
  3. if (!isArray(iterable)) {
  4. return this.reject(new TypeError("must be an array"));
  5. }
  6. var len = iterable.length;
  7. var called = false;
  8. if (!len) {
  9. return this.resolve([]);
  10. }
  11. var i = -1;
  12. var promise = new this(INTERNAL);
  13. while (++i < len) {
  14. resolver(iterable[i]);
  15. }
  16. return promise;
  17. function resolver(value) {
  18. self.resolve(value).then(function (response) {
  19. if (!called) {
  20. called = true;
  21. doResolve(promise, response);
  22. }
  23. }, function (error) {
  24. if (!called) {
  25. called = true;
  26. doReject(promise, error);
  27. }
  28. });
  29. }
  30. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92448.html

相关文章

  • JavaScript 异步

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。写一个符合规范并可配合使用的写一个符合规范并可配合使用的理解的工作原理采用回调函数来处理异步编程。 JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过...

    tuniutech 评论0 收藏0
  • ES6-7

    摘要:的翻译文档由的维护很多人说,阮老师已经有一本关于的书了入门,觉得看看这本书就足够了。前端的异步解决方案之和异步编程模式在前端开发过程中,显得越来越重要。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。 JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMASc...

    mudiyouyou 评论0 收藏0
  • 从源码看 Promise 概念实现

    摘要:从源码看概念与实现是异步编程中的重要概念,它较好地解决了异步任务中回调嵌套的问题。这些概念中有趣的地方在于,标识状态的变量如都是形容词,用于传入数据的接口如与都是动词,而用于传入回调函数的接口如及则在语义上用于修饰动词的副词。 从源码看 Promise 概念与实现 Promise 是 JS 异步编程中的重要概念,它较好地解决了异步任务中回调嵌套的问题。在没有引入新的语言机制的前提下,这...

    kel 评论0 收藏0
  • 深入理解 Promise 实现细节

    摘要:显然,了解的实现细节,可以帮助我们更好地应用它。本文将主要根据的这篇文章,探讨的实现细节。核心说明尽管已经有自己的规范,但目前的各类库,在的实现细节上是有差异的,部分甚至在意义上完全不同。到前面到为止,所实现的都是不能级联的。 在之前的异步JavaScript与Promise一文中,我介绍了Promise以及它在异步JavaScript中的使用意义。一般来说,我们是通过各种JavaSc...

    junbaor 评论0 收藏0
  • 从JS引擎理解Await b()Promise.then(b)的堆栈处理

    摘要:对于引擎来说,两者获取堆栈的方式是不同的。对于引擎来说,堆栈信息附加在了函数所返回的并在链中传递,这样函数也能在需要的时候获取堆栈信息。使用可以实时监控线上应用的错误,并获取完整的堆栈信息。 译者按: Async/Await真的只是简单的语法糖吗?No! 原文:Asynchronous stack traces: why await beats .then() 作者: Math...

    ziwenxie 评论0 收藏0

发表评论

0条评论

hlcc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<