9 # 实现链式调用里普通值处理

简介: 9 # 实现链式调用里普通值处理

普通值处理

下面需要实现 promise 的链式调用问题,目前先处理普通值的情况,如果返回的是普通的值的话:传递到下一次的成功中(不是错误也不是 promise 就是普通值)

// promise 就是一个类
// 1. promise 有三个状态:成功态(resolve) 失败态(reject) 等待态(pending)(又不成功又不失败)
// 2. 用户自己决定失败的原因和成功的原因,成功和失败也是用户定义的
// 3. promise 默认执行器立即执行
// 4. promise 的实例都拥有一个 then 方法,一个参数是成功的回调,另一个是失败的回调
// 5. 如果执行函数时发生了异常也会执行失败的逻辑
// 6. 如果 promise 一旦成功就不能失败,反之亦然,只有等待态的时候才能去更新状态
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;
        // 存放成功回调
        this.onResolveCallbacks = [];
        // 存放失败回调
        this.onRejectCallbacks = [];
        let resolve = (value) => {
            if (this.status === PENDING) {
                this.value = value;
                this.status = RESOLVE;
                this.onResolveCallbacks.forEach((fn) => fn());
            }
        };
        let reject = (reason) => {
            if (this.status === PENDING) {
                this.reason = reason;
                this.status = REJECT;
                this.onRejectCallbacks.forEach((fn) => fn());
            }
        };
        try {
            // 立即执行
            executor(resolve, reject);
        } catch (error) {
            // 处理错误异常
            reject(error);
        }
    }
    // 1. promise 成功和失败的回调的返回值可以传递到外层的下一个 then
    // 2. promise 返回值情况
    //  2.1. 如果返回的是普通的值的话:传递到下一次的成功中(不是错误也不是 promise 就是普通值)
    //  2.2. 如果返回的是错误的情况:一定会走到下一次的失败中
    //  2.3. 如果返回的是 promise 的情况:会采用 promise 的状态,决定下一步是走成功还是失败
    // 3. 错误处理:如果离自己最近的 then 没有错误处理(没有写错误函数)会向下找
    // 4. 每次执行完 `promise.then` 方法后返回的都是一个新的 promise (promise 一旦成功或者失败都不能去修改状态)
    // promise 必须提供 then 方法来存取它当前或最终的值或者原因。
    // then 接收两个参数:onFulfilled 和 onRejected
    then(onFulfilled, onRejected) {
        // 实现链式调用
        let kaimoPromise = new KaimoPromise((resolve, reject) => {
            if (this.status === RESOLVE) {
                let x = onFulfilled(this.value);
                resolve(x);
            }
            if (this.status === REJECT) {
                onRejected(this.reason);
            }
            if (this.status === PENDING) {
                this.onResolveCallbacks.push(() => {
                    onFulfilled(this.value);
                });
                this.onRejectCallbacks.push(() => {
                    onRejected(this.reason);
                });
            }
        });
        return kaimoPromise;
    }
}
module.exports = KaimoPromise;

测试:

const KaimoPromise = require("./9/kaimo-promise.js");
// 调用 p1.resolve() => p1.then(data)
//      p2.resolve() => p2.then(data)
let p1 = new KaimoPromise((resolve, reject) => {
    resolve("kaimo666");
});
let p2 = p1.then((data) => {
    console.log("p1---resolve--->", data);
    return "kaimo777";
});
p2.then((data) => {
    console.log("p2---resolve--->", data);
});

目录
相关文章
|
定位技术 Python
福利!基于 ArcGIS Pro 的Python 教学书籍开放下载
福利!基于 ArcGIS Pro 的Python 教学书籍开放下载
435 0
|
11月前
|
网络协议 安全 算法
OSPF的认证机制:原理、配置与应用
OSPF的认证机制:原理、配置与应用
400 3
|
11月前
|
机器学习/深度学习 数据采集 安全
道路缝隙识别:智能交通与自动化巡检的技术应用
本文介绍了利用现代计算机视觉和深度学习技术实现道路缝隙自动化识别的方法,涵盖图像采集、预处理、缝隙检测、分类评估及报警报告生成等步骤,旨在提高城市交通管理和道路维护效率。通过卷积神经网络(CNN)模型的构建与训练,实现了对道路裂缝的高效准确识别,有效提升了道路巡检的自动化水平。
|
Java 应用服务中间件 Android开发
eclipse项目导入到idea
eclipse项目导入到idea
403 0
|
存储 分布式计算 资源调度
吐血整理的Hadoop最全开发指南【Hadoop集群搭建篇】(上)
吐血整理的Hadoop最全开发指南【Hadoop集群搭建篇】
611 0
吐血整理的Hadoop最全开发指南【Hadoop集群搭建篇】(上)
|
机器学习/深度学习 算法 数据挖掘
有监督学习和无监督学习区别
有监督学习和无监督学习区别
|
存储 安全 数据管理
构建智慧家庭的未来:物联网平台与智能家居系统的开发
在数字化时代,物联网平台和智能家居系统的开发日益受到关注。本文将探讨物联网平台和智能家居系统的定义、优势以及开发过程中的挑战与解决方案。通过对智能家居系统的构建和物联网平台的应用,我们可以实现更加智能、高效和安全的生活环境。
459 3
|
JSON API 数据格式
【Python】一文带你认识 Web 框架之 FastAPI
FastAPI是一个现代、快速(高性能)的Web框架,用于构建API,基于Python 3.6+,并使用了标准的Python类型注解(Python 3.5也支持类型注解),以获得交互式API文档(通过OpenAPI/Swagger)和自动验证。FastAPI是一个Web框架,它与Flask和Django等框架不同。它具有更高的性能和易用性,并提供了最新的标准和技术,例如类型注释、异步编程、请求和响应体(JSON和其他数据格式)的内置验证和文档生成等。
851 0
【Python】一文带你认识 Web 框架之 FastAPI
|
数据可视化 数据挖掘 数据处理
SPSS(Statistical Package for the Social Sciences)
SPSS(Statistical Package for the Social Sciences)是一种统计分析软件,广泛用于社会科学、商业和健康领域的数据分析。它提供了一套功能强大的工具和方法,用于数据收集、数据处理、数据可视化和统计分析。
492 1
|
传感器 SQL 安全
瑞数信息《2023 API安全趋势报告》重磅发布: API攻击持续走高,Bots武器更聪明
如今API作为连接服务和传输数据的重要通道,已成为数字时代的新型基础设施,但随之而来的安全问题也日益凸显。为了让各个行业更好地应对API安全威胁挑战,瑞数信息作为国内首批具备“云原生API安全能力”认证的专业厂商,近年来持续输出API安全相关观点,为政企用户做好API安全防护提供参考指南。
376 0
瑞数信息《2023 API安全趋势报告》重磅发布: API攻击持续走高,Bots武器更聪明