6 # 实现简单的 promise

简介: 6 # 实现简单的 promise

什么是 Promise ?

在 JavaScript 中,Promise 是一种用于处理异步操作的对象,它可以更加优雅地处理回调函数嵌套和错误处理。

promise es6已经内部实现了, ie 不兼容 promise,需要 polyfill (比如:es-promise)

Promise A+

Promise A+ 规范是为了解决 Promise 的实现中出现的一些问题和不一致性,以促进 Promise 的标准化和互操作性。

Promise A+ 规范定义了 Promise 对象的行为和状态转换规则,以及 then 方法的参数和返回值要求等,使不同的 Promise 实现可以遵循同样的规范,从而实现互操作性和可组合性。

promise A+ 规范:https://promisesaplus.com/

Promises/A+ 规范,有现成的单元测试套件,很容易搭建开发环境,以及验证代码是否符合规范要求。具体地址:https://github.com/promises-aplus/promises-tests

为什么会产生 promise,它解决了什么问题?

  1. 过个异步请求并发(希望同步最终结果)Promise.all
  2. 链式异步请求问题(上一个的输出是下一个的输入)Promise的链式调用可以解决这个问题
  3. 缺陷:还是基于回调

实现一个简易版本的 promise

promise 特性

  1. promise 有三个状态:成功态(resolve) 失败态(reject) 等待态(pending)(又不成功又不失败)
  2. 用户自己决定失败的原因和成功的原因,成功和失败也是用户定义的
  3. promise 默认执行器立即执行
  4. promise 的实例都拥有一个 then 方法,一个参数是成功的回调,另一个是失败的回调
  5. 如果执行函数时发生了异常也会执行失败的逻辑
  6. 如果 promise 一旦成功就不能失败,反之亦然,只有等待态的时候才能去更新状态

新建文件 kaimo-promise.js 添加下面代码

const RESOLVE = "RESOLVE"; // 成功态
const REJECT = "REJECT"; // 失败态
const PENDING = "PENDING"; // 等待态
class KaimoPromise {
    constructor(executor) {
        this.status = PENDING;
        // value 是任意合法的 Javascript 值,(包括 undefined,thenable, promise)。
        this.value = undefined;
        // reason 是表示 promise 为什么被 rejected 的值
        this.reason = undefined;
        let resolve = (value) => {
            if (this.status === PENDING) {
                this.value = value;
                this.status = RESOLVE;
            }
        };
        let reject = (reason) => {
            if (this.status === PENDING) {
                this.reason = reason;
                this.status = REJECT;
            }
        };
        try {
            // 立即执行
            executor(resolve, reject);
        } catch (error) {
            // 处理错误异常
            reject(error);
        }
    }
    // promise 必须提供 then 方法来存取它当前或最终的值或者原因。
    // then 接收两个参数:onFulfilled 和 onRejected
    then(onFulfilled, onRejected) {
        if (this.status === RESOLVE) {
            onFulfilled(this.value);
        }
        if (this.status === REJECT) {
            onRejected(this.reason);
        }
    }
}
module.exports = KaimoPromise;

使用

let KaimoPromise = require("./6/kaimo-promise.js");
let promise = new KaimoPromise((resolve, reject) => {
    console.log(1);
    // throw new Error("异常");
    resolve("成功");
    // reject("失败");
});
console.log(2);
promise.then(
    (data) => {
        console.log("success", data);
    },
    (err) => {
        console.log("failed", err);
    }
);

目录
相关文章
|
10月前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
375 8
|
12月前
|
存储 前端开发 JavaScript
🚀 10 个 GitHub 存储库,助你成为前端巨匠✨
本文介绍了10个极具价值的GitHub存储库,旨在帮助各级JavaScript开发人员提升技能。这些资源涵盖了从基本概念到高级算法、编码风格指南、面试准备等各个方面,包括经典书籍、实用工具和面试手册。无论您是刚入门的新手还是有经验的开发者,这些存储库都能为您提供丰富的学习资源,助您在JavaScript领域更进一步。探索这些资源,开启您的学习之旅吧!
219 0
🚀 10 个 GitHub 存储库,助你成为前端巨匠✨
|
编解码 监控 网络协议
如何用魔法般的步骤实现RTSP推送H.264与H.265(HEVC),打造震撼视听盛宴,让每一帧都充满魔力!
【9月更文挑战第3天】实现RTSP流媒体服务推送H.264和H.265编码视频是现代视频监控及直播平台的关键技术。本文详细介绍环境搭建、编码配置及服务器与客户端实现方法。首先,通过FFmpeg捕获视频并编码成RTSP流,接着使用VLC等工具接收播放。此外,还提供了C++示例代码,演示如何利用libv4l2和FFmpeg自定义服务器端实现。希望本文能帮助读者成功搭建RTSP视频流系统。
1885 1
|
网络协议 Java API
【Java】Java Socket编程:建立网络连接的基础
【Java】Java Socket编程:建立网络连接的基础
201 1
图解java工程师学习路线
图解java工程师学习路线
364 0
|
机器学习/深度学习 自然语言处理 算法
一文综述,未来已来 | 视觉和大语言模型的未来是什么?必然结连理实现多模态大模型
一文综述,未来已来 | 视觉和大语言模型的未来是什么?必然结连理实现多模态大模型
432 1
|
Web App开发 编解码 监控
RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道
RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道
4141 0
|
编解码 监控 网络协议
干货:如何实现RTSP推送H.264、RTSP推送H.265(hevc)
rtsp推送相关的资料和测试软件比较少,本文介绍rtsp推送相关信令和测试效果: 1. rtsp推送流程. 主要分两部分:第一部分先发送信令;第二部分发送rtp包。
836 1
【鸿蒙软件开发】ArkTS基础组件之Marquee(文字跑马灯)、QRCode(二维码生成)
【鸿蒙软件开发】ArkTS基础组件之Marquee(文字跑马灯)、QRCode(二维码生成)
708 0
RTSP服务器之————rtsp-server(轻量级RTSP / RTP流媒体服务器)
github:https://github.com/revmischa/rtsp-server 轻量级RTSP / RTP流媒体服务器
9655 0