• promise使用与源码封装(二)


    如何使用Promise?

    1. Promise构造函数: Promise (excutor) {}

            excutor函数: 同步执行  (resolve, reject) => {}

            resolve函数: 内部定义成功时我们调用的函数 value => {}

            reject函数: 内部定义失败时我们调用的函数 reason => {}

            说明: excutor会在Promise内部立即同步回调,异步操作在执行器中执行

        2. Promise.prototype.then方法: (onResolved, onRejected) => {}

            onResolved函数: 成功的回调函数  (value) => {}

            onRejected函数: 失败的回调函数 (reason) => {}

            说明: 指定用于得到成功value的成功回调和用于得到失败reason的失败回调

                  返回一个新的promise对象

        3. Promise.prototype.catch方法: (onRejected) => {}

            onRejected函数: 失败的回调函数 (reason) => {}

            说明: then()的语法糖, 相当于: then(undefined, onRejected)

        4. Promise.resolve方法: (value) => {}

            value: 成功的数据或promise对象

            说明: 返回一个成功/失败的promise对象

        5. Promise.reject方法: (reason) => {}

            reason: 失败的原因

            说明: 返回一个失败的promise对象

        6. Promise.all方法: (promises) => {}

            promises: 包含n个promise的数组

            说明: 返回一个新的promise, 只有所有的promise都成功才成功, 只要有一个失败了就直接失败

        7. Promise.race方法: (promises) => {}

            promises: 包含n个promise的数组

            说明: 返回一个新的promise, 第一个完成的promise的结果状态就是最终的结果状态

     1 .初始化架构

    1. function Promise(executor){
    2. }
    3. //添加 then 方法
    4. Promise.prototype.then = function(onResolved, onRejected){
    5. }

    2.创造resolve跟reject

    1. //声明构造函数
    2. function Promise(executor){
    3. //resolve 函数
    4. function resolve(data){
    5. }
    6. //reject 函数
    7. function reject(data){
    8. }
    9. //同步调用『执行器函数』
    10. executor(resolve, reject);
    11. }
    12. //添加 then 方法
    13. Promise.prototype.then = function(onResolved, onRejected){
    14. }

    3.resolve与inject实现

    PromiseState为属性状态(pending,fulfilled,rejected)

    PromiseResult为返回结果

    1. //声明构造函数
    2. function Promise(executor){
    3. //添加属性
    4. this.PromiseState = 'pending';
    5. this.PromiseResult = null;
    6. //保存实例对象的 this 的值
    7. const self = this;// self _this that
    8. //resolve 函数
    9. function resolve(data){
    10. //1. 修改对象的状态 (promiseState)
    11. self.PromiseState = 'fulfilled';// resolved
    12. //2. 设置对象结果值 (promiseResult)
    13. self.PromiseResult = data;
    14. }
    15. //reject 函数
    16. function reject(data){
    17. //1. 修改对象的状态 (promiseState)
    18. self.PromiseState = 'rejected';//
    19. //2. 设置对象结果值 (promiseResult)
    20. self.PromiseResult = data;
    21. }
    22. //同步调用『执行器函数』
    23. executor(resolve, reject);
    24. }
    25. //添加 then 方法
    26. Promise.prototype.then = function(onResolved, onRejected){
    27. }

    4.抛出错误 try catch

    try{

            //同步调用『执行器函数』

            executor(resolve, reject);

        }catch(e){

            //修改 promise 对象状态为『失败』

            reject(e);

        }

    1. //声明构造函数
    2. function Promise(executor){
    3. //添加属性
    4. this.PromiseState = 'pending';
    5. this.PromiseResult = null;
    6. //保存实例对象的 this 的值
    7. const self = this;// self _this that
    8. //resolve 函数
    9. function resolve(data){
    10. //1. 修改对象的状态 (promiseState)
    11. self.PromiseState = 'fulfilled';// resolved
    12. //2. 设置对象结果值 (promiseResult)
    13. self.PromiseResult = data;
    14. }
    15. //reject 函数
    16. function reject(data){
    17. //1. 修改对象的状态 (promiseState)
    18. self.PromiseState = 'rejected';//
    19. //2. 设置对象结果值 (promiseResult)
    20. self.PromiseResult = data;
    21. }
    22. try{
    23. //同步调用『执行器函数』
    24. executor(resolve, reject);
    25. }catch(e){
    26. //修改 promise 对象状态为『失败』
    27. reject(e);
    28. }
    29. }
    30. //添加 then 方法
    31. Promise.prototype.then = function(onResolved, onRejected){
    32. }

    5.promise的属性状态只能更改一次

    在resolve与reject函数中进行PromiseState状态判断

    1. //声明构造函数
    2. function Promise(executor){
    3. //添加属性
    4. this.PromiseState = 'pending';
    5. this.PromiseResult = null;
    6. //保存实例对象的 this 的值
    7. const self = this;// self _this that
    8. //resolve 函数
    9. function resolve(data){
    10. //判断状态
    11. if(self.PromiseState !== 'pending') return;
    12. //1. 修改对象的状态 (promiseState)
    13. self.PromiseState = 'fulfilled';// resolved
    14. //2. 设置对象结果值 (promiseResult)
    15. self.PromiseResult = data;
    16. }
    17. //reject 函数
    18. function reject(data){
    19. //判断状态
    20. if(self.PromiseState !== 'pending') return;
    21. //1. 修改对象的状态 (promiseState)
    22. self.PromiseState = 'rejected';//
    23. //2. 设置对象结果值 (promiseResult)
    24. self.PromiseResult = data;
    25. }
    26. try{
    27. //同步调用『执行器函数』
    28. executor(resolve, reject);
    29. }catch(e){
    30. //修改 promise 对象状态为『失败』
    31. reject(e);
    32. }
    33. }
    34. //添加 then 方法
    35. Promise.prototype.then = function(onResolved, onRejected){
    36. }

    6. then方法回调

    1. Promise.prototype.then = function(onResolved, onRejected){
    2. console.log(this,'this')
    3. //调用回调函数 PromiseState
    4. if(this.PromiseState === 'fulfilled'){
    5. onResolved(this.PromiseResult);
    6. }
    7. if(this.PromiseState === 'rejected'){
    8. onRejected(this.PromiseResult);
    9. }
    10. }

    7.异步任务then方法执行回调

    先指定回调在执行异步任务

    在then方法中PromiseState状态未改变,所以我们需要先存储回调方法,需要在resolve方法或reject方法中执行

    1. //声明构造函数
    2. function Promise(executor){
    3. //添加属性
    4. this.PromiseState = 'pending';
    5. this.PromiseResult = null;
    6. //声明属性
    7. this.callback = {};
    8. //保存实例对象的 this 的值
    9. const self = this;// self _this that
    10. //resolve 函数
    11. function resolve(data){
    12. //判断状态
    13. if(self.PromiseState !== 'pending') return;
    14. //1. 修改对象的状态 (promiseState)
    15. self.PromiseState = 'fulfilled';// resolved
    16. //2. 设置对象结果值 (promiseResult)
    17. self.PromiseResult = data;
    18. //调用成功的回调函数
    19. if(self.callback.onResolved){
    20. self.callback.onResolved(data);
    21. }
    22. }
    23. //reject 函数
    24. function reject(data){
    25. //判断状态
    26. if(self.PromiseState !== 'pending') return;
    27. //1. 修改对象的状态 (promiseState)
    28. self.PromiseState = 'rejected';//
    29. //2. 设置对象结果值 (promiseResult)
    30. self.PromiseResult = data;
    31. //执行回调
    32. if(self.callback.onResolved){
    33. self.callback.onResolved(data);
    34. }
    35. }
    36. try{
    37. //同步调用『执行器函数』
    38. executor(resolve, reject);
    39. }catch(e){
    40. //修改 promise 对象状态为『失败』
    41. reject(e);
    42. }
    43. }
    44. //添加 then 方法
    45. Promise.prototype.then = function(onResolved, onRejected){
    46. //调用回调函数 PromiseState
    47. if(this.PromiseState === 'fulfilled'){
    48. onResolved(this.PromiseResult);
    49. }
    50. if(this.PromiseState === 'rejected'){
    51. onRejected(this.PromiseResult);
    52. }
    53. //判断 pending 状态
    54. if(this.PromiseState === 'pending'){
    55. //保存回调函数
    56. this.callback = {
    57. onResolved: onResolved,
    58. onRejected: onRejected
    59. }
    60. }
    61. }
    1. //实例化对象
    2. let p = new Promise((resolve, reject) => {
    3. setTimeout(() => {
    4. // resolve('OK');
    5. reject("error");
    6. }, 1000);
    7. });
    8. p.then(value => {
    9. console.log(value);
    10. }, reason=>{
    11. console.warn(reason);
    12. });
    13. console.log(p);

    8.指定多个回调

    需要将多个回调都存储起来,然后在resolve与reject方法中循环执行后调方法

    1. //声明构造函数
    2. function Promise(executor){
    3. //添加属性
    4. this.PromiseState = 'pending';
    5. this.PromiseResult = null;
    6. //声明属性
    7. this.callbacks = [];
    8. //保存实例对象的 this 的值
    9. const self = this;// self _this that
    10. //resolve 函数
    11. function resolve(data){
    12. //判断状态
    13. if(self.PromiseState !== 'pending') return;
    14. //1. 修改对象的状态 (promiseState)
    15. self.PromiseState = 'fulfilled';// resolved
    16. //2. 设置对象结果值 (promiseResult)
    17. self.PromiseResult = data;
    18. //调用成功的回调函数
    19. self.callbacks.forEach(item => {
    20. item.onResolved(data);
    21. });
    22. }
    23. //reject 函数
    24. function reject(data){
    25. //判断状态
    26. if(self.PromiseState !== 'pending') return;
    27. //1. 修改对象的状态 (promiseState)
    28. self.PromiseState = 'rejected';//
    29. //2. 设置对象结果值 (promiseResult)
    30. self.PromiseResult = data;
    31. //执行失败的回调
    32. self.callbacks.forEach(item => {
    33. item.onRejected(data);
    34. });
    35. }
    36. try{
    37. //同步调用『执行器函数』
    38. executor(resolve, reject);
    39. }catch(e){
    40. //修改 promise 对象状态为『失败』
    41. reject(e);
    42. }
    43. }
    44. //添加 then 方法
    45. Promise.prototype.then = function(onResolved, onRejected){
    46. //调用回调函数 PromiseState
    47. if(this.PromiseState === 'fulfilled'){
    48. onResolved(this.PromiseResult);
    49. }
    50. if(this.PromiseState === 'rejected'){
    51. onRejected(this.PromiseResult);
    52. }
    53. //判断 pending 状态
    54. if(this.PromiseState === 'pending'){
    55. //保存回调函数
    56. this.callbacks.push({
    57. onResolved: onResolved,
    58. onRejected: onRejected
    59. });
    60. }
    61. }
    1. let p = new Promise((resolve, reject) => {
    2. setTimeout(() => {
    3. // resolve('OK');
    4. reject('No');
    5. }, 1000);
    6. });
    7. p.then(value => {
    8. console.log(value);
    9. }, reason=>{
    10. console.warn(reason);
    11. });
    12. p.then(value => {
    13. alert(value);
    14. }, reason=>{
    15. alert(reason);
    16. });
    17. console.log(p);

  • 相关阅读:
    Spring 框架学习(四)---- 常用配置
    小学生python游戏编程arcade----敌人自动移向角色并开火类的实现
    云原生之深入解析分布式存储系统Ceph的环境部署和实战操作
    多个列表参数一一对应使用枚举
    ...args: any[] TypeScript 中的剩余参数语法
    后台管理系统中,实现修改功能时,数据回显导致table-column数据消失。罪魁祸首竟是浅拷贝
    operator 之旅(一)
    JS中一些判空操作,判null,判undefined操作和简化操作和if操作
    go实现限流器
    关于yolov8-class Pose(Detect)
  • 原文地址:https://blog.csdn.net/beichen3997/article/details/127903731