首页 > 其他分享 >异步编码规范

异步编码规范

时间:2023-12-18 12:23:40浏览次数:28  
标签:异步 resolve const 编码 res 规范 MyPromise promise reject

异步编码规范

  1. 手写promise
  2. promise A+ 规范
  3. async await 原理
  4. generator -- 忽略

Promise

1.特点
1.1 状态不可逆转==》不可从一个状态变为另外一个状态

promise的方法

  • finally

finally 方法没有参数,也不会改变 Promise 的状态,它只是在 Promise 结束时提供了一个通知机制,
让我们可以在 Promise 结束后执行一些清理工作(比如操作文件的时候关闭文件流)。

  • all

接受一个具有Iterable接口的类型,如数组,Map,Set,传入多个promise,
每一个promise执行成功resolve,最后才执行成功(返回一个Promise实例),进入then,否则失败进入catch

  • allSettled

接受一个具有Iterable接口的类型,如数组,Map,Set,传入多个promise,
每个promise状态改变成fulfilled或者rejected之后返回,返回的是一个数组对象,对象中有状态status和每一项的返回结果value;

  • race

以快为准,数组中所有的promise对象,有一个先执行了何种状态,该对象就为何种状态,并执行相应函数
接受一个具有Iterable接口的类型,如数组,Map,Set,传入多个promise,
其中有一个promise返回了,不管是fulfilled或者rejected,直接返回这个promise的结果

  • any

接受一个具有Iterable接口的类型,如数组,Map,Set,传入多个promise,
当传入的任何一个promise成功的时候,不管其他是否成功或者失败,会把成功的那个promise返回

手写promise的实现

 class MyPromise {
      constructor(executor) {
        this.initValue();
        this.initBind();
        try {
          executor(this.resolve, this.reject);
        } catch (error) {
          this.reject(error);
        }
      }

      initValue() {
        this.promiseStatus = 'pending';
        this.promiseResult = null;
        this.onFulfilledCallbacks = [];
        this.onRejectedCallbacks = [];
      }

      initBind() {
        this.resolve = this.resolve.bind(this);
        this.reject = this.reject.bind(this);
      }

      resolve(value) {
        if (this.promiseStatus !== 'pending') {
          return;
        }
        this.promiseStatus = 'fulfilled';
        this.promiseResult = value;
        this.onFulfilledCallbacks.forEach(fn => fn(this.promiseResult))
      }

      reject(reason) {
        if (this.promiseStatus !== 'pending') {
          return;
        }
        this.promiseStatus = 'rejected';
        this.promiseResult = reason;
        this.onRejectedCallbacks.forEach(fn => fn(this.promiseResult))
      }

      then(onFulfilled, onRejected) {
        //参数校验 确保then的两个参数都是函数
        onFulfilled =
          typeof onFulfilled === 'function'
            ? onFulfilled
            : val => val;
        onRejected =
          typeof onRejected === 'function'
            ? onRejected
            : reason => { throw reason }

        // 实现链式调用
        const thenPromise = new MyPromise((resolve, reject) => {
          const resolvePromise = cb => {
            try {
              const x = cb(this.promiseResult)
              if (x === thenPromise) {
                // 不能返回自身哦
                throw new Error('不能返回自身。。。')
              }
              if(x instanceof MyPromise){
                x.then(resolve, reject)
              }else{
                resolve(x)
              }
              
            } catch (error) {
              reject(error);
              throw new Error(error)
            }
          }

          if (this.promiseStatus === 'fulfilled') {
            resolvePromise(onFulfilled);
          } else if (this.promiseStatus === 'rejected') {
            resolvePromise(onRejected);
          } else if (this.promiseStatus === 'pending') {
            this.onFulfilledCallbacks.push(resolvePromise.bind(this,onFulfilled));
            this.onRejectedCallbacks.push(resolvePromise.bind(this,onRejected));
          }
        })
        return thenPromise
      }
    }

    const p1 = new MyPromise((resolve, reject) => {
      // 不能确定3秒后执行then方法,但是可以保证在3秒后执行then中的回调
      setTimeout(() => {
        resolve('success')
      }, 3000)
    });
    p1.then(
      res => {
        console.log(res),
          err => console.log(err);
      }).then(res => console.log(res,'rrr'))

Promise.all

// promise.all的实现
    function myPromiseAll(promiseList) {
      return new MyPromise((resolve, reject) => {
        const result = [];
        const count = 0;
        const addData = (index,data) => {
          result[index] = data;
          count++
          if(count === promiseList.length){
            resolve(result)
          }
        }
        promiseList.forEach((promise, index) => {
          if (promise instanceof MyPromise) {
            promise.then(
              res => addData(index, res)
              , err => reject(err)
            )
          }else{
            addData(index, promise)
          }
        })
      })
    }

promise.race的实现

// promise.race的实现
      function myPromiseAll(promiseList) {
        return new MyPromise((resolve, reject) => {
          promiseList.forEach((promise, index) => {
            if (promise instanceof MyPromise) {
              promise.then(
                res => resolve(res)
                , err => reject(err)
              )
            } else {
              resolve(promise)
            }
          })
        })
      }

promise allSettled

    function myPromiseAll(promiseList) {
      return new MyPromise((resolve, reject) => {
        const result = [];
        const count = 0;
        const addData = (index, data, status) => {
          result[index] = {
            data, 
            status
          }
          count++
          if (count === promiseList.length) {
            resolve(result)
          }
        }
        promiseList.forEach((promise, index) => {
          if (promise instanceof MyPromise) {
            promise.then(
              res => addData(index, res, 'fulfilled')
              , err => reject(err,'rejected')
            )
          } else {
            addData(index, promise,'fulfilled')
          }
        })
      })
    }

promise any

      function myPromiseAll(promiseList) {
        return new MyPromise((resolve, reject) => {
          const count = 0;
          promiseList.forEach(promise => {
            promise.then(res => resolve(res),err => {
              count++;
              if (count === promiseList.length) {
                reject(result)
              }
            })
          })
        })
      }

标签:异步,resolve,const,编码,res,规范,MyPromise,promise,reject
From: https://www.cnblogs.com/crazy-rock/p/17909452.html

相关文章

  • idea java import 规范化
    参考官方配置文件功能介绍一些标准会针对import的顺序、import*的使用有一定的要求,为了避免手动调整的窘境,可以通过idea基础配置,来实现import的自动格式化、规范化。配置路径:Settings-->Editor-->CodeStyle-->Java-->Imports选项内容解析:Layoutstaticimportsseparat......
  • Rethinking and Improving Relative Position Encoding for Vision Transformer: ViT
    RethinkingandImprovingRelativePositionEncodingforVisionTransformer*Authors:[[KanWu]],[[HouwenPeng]],[[MinghaoChen]],[[JianlongFu]],[[HongyangChao]]初读印象comment::(iRPE)提出了专门用于图像的相对位置编码方法,code:Cream/iRPEatmain·mi......
  • SOLIDWORKS编码重命名批量完成原来这么简单
    每个公司都有自己的编码规则及命名规则,因此新产品设计完成之后,都需要对新设计的零部件进行重新编码及命名,今天我们来介绍一款提高编码及命名效率的插件—SolidKits.BatchCoding。SolidKits.BatchCoding批量编码器是对于PDM的SolidKits分类编码器插件以及高级报表自动编码功能的补......
  • 【python扩展之软件开发目录规范】---软件开发目录规范
    title:【python扩展之软件开发目录规范】---软件开发目录规范date:2023-12-1618:54:06updated:2023-12-1619:20:00description:【python扩展之软件开发目录规范】---软件开发目录规范cover: https://blog.csdn.net/DiligentGG/article/details/125784751......
  • MATLAB实现huffman编码及译码
    使用前将建立input.txt放在和该.m文件同一文件夹中运行即可最后运行结果:1.文本统计过后的信源空间2.信源空间对应的柱状图3.编码结果4.译码结果对彩色图像进行huffman编码,解码,显示原图像clc;closeall;clearall;%数据读取txt=fopen('input.txt');shuju=fscanf(txt,'%c')......
  • 一文弄懂自编码器 -- Autoencoders
    1.引言近年来,自编码器(Autoencoder)一词在许多人工智能相关的研究论文、期刊和学位论文中被频繁提及。自动编码器于1980年推出,是一种用于神经网络的无监督学习技术,可以从未被标注的训练集中学习。本文重点介绍自编码器的概念、相关变体及其应用,闲话少说,我们直接开始吧!2.原理介绍自......
  • Python准备之软件开发规范
    软件开发规范【一】常见的开发规范软件开发规范是一组为了保持代码质量、可维护性和协作效率而制定的约定和准则。这些规范通常由开发团队、组织或行业制定,并且在整个软件开发生命周期中都需要遵循。以下是一些常见的软件开发规范:命名规范:使用有意义的变量、函数和类名,遵循......
  • 遍历utf-8编码下的所有汉字得出的个数是20901个,最终发现实际里面多数是不认识的,常用汉
    utf-8编码下的汉字个数是多少?从正则表达式可以看出  4E00-9FA5实用php遍历一下所有汉字1<?php2//4E00-9FA53//输出所有汉字4header('Content-Type:text/html;charset=utf8');//非必要5$start=hexdec('4e00');//等于0x4e00;hexdec是16进制转为10进制......
  • 直播平台源码,教你如何写出同步与异步
    直播平台源码,教你如何写出同步与异步同步示例代码:console.log("开始");functionsyncOperation(){console.log("同步操作");}syncOperation();console.log("结束"); 输出结果:开始同步操作结束 在上述代码中,同步操作syncOperation()按照顺序......
  • 软件开发规范
    软件开发规范#软件开发规范#要求你的项目符合大众的开发风格---PE8规范(约束你的Python语法)#为了各个软件之间开发出来的成品项目更具有辨识度,所以就有了一套软件开发规范-ATM#项目名 |-README.md#项目说明书(使用的技术栈/框架/项目说明)|-start.py#......