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);
});

目录
相关文章
|
小程序 开发者 安全
福利!支付宝小程序开发必备的7款开源DEMO
相比于APP,小程序已经大大降低了开发者们的学习和开发的门槛。而如何进一步提高小程序开发者的学习和开发效率,一直是支付宝小程序团队非常重视的课题。对于开发者而言, 文档可以提供基础的引导,而针对性的、基于常见场景的DEMO则更为直观清晰易懂,可以大大节约上手的成本。
7798 0
福利!支付宝小程序开发必备的7款开源DEMO
|
10月前
|
机器学习/深度学习 人工智能 算法
o3-mini:OpenAI 发布最新推理模型,强大的STEM推理能力,灵活调整推理强度
OpenAI o3-mini是OpenAI推出的全新推理模型,专为科学、数学和编程等技术领域优化,支持三种推理强度,灵活调整性能。
604 25
o3-mini:OpenAI 发布最新推理模型,强大的STEM推理能力,灵活调整推理强度
|
11月前
|
运维 监控 安全
《筑牢安全防线:鸿蒙Next ArkTS中的模型安全审计与漏洞检测》
在鸿蒙Next ArkTS开发中,模型的安全审计和漏洞检测至关重要。本文探讨如何利用HiChecker进行基础检测、审计日志管理与分析、静态代码分析、模型加密与签名及实时监控与异常检测等手段,确保模型的安全可靠运行,保护用户数据安全,提升应用稳定性。
394 32
|
9月前
|
人工智能 自然语言处理 算法
阿里云「AI实时互动」正式上线,体验“超拟人”智能互动
阿里云「AI实时互动」正式上线,体验“超拟人”智能互动
667 1
|
10月前
|
机器学习/深度学习 人工智能 API
aliyun评测零门槛、即刻拥有 DeepSeek-R1 满血版
DeepSeek-R1满血版是一款零门槛、高性能的深度学习工具,旨在帮助开发者和研究人员高效实现创新。评测显示,其操作界面设计友好,左右分屏布局使理论与实践紧密结合,极大提升了操作连贯性和效率。用户可轻松获取API-KEY,并通过Chatbox配置进行深度学习对话,整个过程简单流畅。该工具在部署集成性、易用性及高性能计算支持方面表现出色,尤其适合本地软件部署,满足用户的实际需求。阿里云提供的详尽文档和引导也使得初次使用者能快速上手,体验极佳。
288 1
|
12月前
|
人工智能 前端开发 数据可视化
2024年低代码趋势洞察——企业最看重的功能有哪些
低代码平台通过可视化开发、五大核心引擎(SQL、功能、模板、图表、切面引擎)、模型驱动开发、高效数据处理、AI智能助力及灵活插件生态等功能,简化开发流程,提高效率,降低成本,成为企业加速数字化转型的关键驱动力。其强大的技术架构和企业级特性,进一步提升了运营效率与决策能力。
|
机器学习/深度学习 数据采集 安全
道路缝隙识别:智能交通与自动化巡检的技术应用
本文介绍了利用现代计算机视觉和深度学习技术实现道路缝隙自动化识别的方法,涵盖图像采集、预处理、缝隙检测、分类评估及报警报告生成等步骤,旨在提高城市交通管理和道路维护效率。通过卷积神经网络(CNN)模型的构建与训练,实现了对道路裂缝的高效准确识别,有效提升了道路巡检的自动化水平。
|
Linux 数据安全/隐私保护
【Deepin 20 系统】Linux系统在开机时未进入系统前进入命令行界面(终端)
如何在Deepin 20系统启动时进入命令行界面(终端),通过在GRUB界面中编辑内核启动参数来引导系统进入多用户文本模式(运行级别3)。
1028 1
|
存储 缓存 运维
阿里云数据库 ClickHouse 云原生版产品解析
本文简要概述了开源 ClickHouse 应用行业场景及性能优势,以及业界对于ClickHouse的关注度趋势和使用情况。 详细说明阿里云数据库ClickHouse 云原生版架构和功能特性,分析自建ClickHouse 用户使用过程中遇到的问题,以及如何通过云原生版本解决自建的部分难点问题。最后介绍云原生版本试用申请流程。
3620 1
阿里云数据库 ClickHouse 云原生版产品解析