首页 > 编程语言 >[JavaScript] 自顶向下学习如何手写promise

[JavaScript] 自顶向下学习如何手写promise

时间:2022-11-30 15:02:28浏览次数:56  
标签:resolve JavaScript reason promise result reject 自顶向下 回调

引子

去年写了一篇有关promise的手写文章,写到一半发现自己的理解还不是很透彻,写的很烂,今年卷土重来,实现部分采用功能分解,目录跳转的形式呈现,力求最通俗易懂得剖析promise,我们开始吧。

通过本文你能学到什么:

  1. 为什么需要用到promise
  2. 链式调用的概念及如何实现
  3. 发布订阅模式在promise中的应用
  4. 递归思想
  5. 一步步带你分解功能,手写实现一个promise,包括静态方法:all、allSettled、race、resolve、reject
  6. 如何测试自己写的promise是否符合规范

1. 认识promise

promise是ES6原生实现的一种解决异步编程的方案,我们都知道js是一门单线程语言,使用异步编程(事件和回调函数)的方式进行定时器任务、网络请求等。不了解promise用法的同学建议看看这一篇《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版 - promise对象》

✅举个例子:

看一个简单的异步任务定时器的例子:

// 模拟异步任务
function fn(s, callback) {
    setTimeout(() => {
        console.log(s);
        callback(s);
    }, 2000);
}

// 第一种: 使用回调函数
fn("1", (s) => {
    s += "2";
    fn(s, () => {
        s += "3";
        fn(s, () => {
            s += "4";
            fn(s, () => {
                s += "5";
                fn(s, () => {
                    console.log("result:", s);
                    console.log('done')
                });
            });
        });
    });
});

// 第二种: 使用promise
function promiseFactory(str) {
    return new Promise((resolve, reject) => {
        fn(str, resolve);
    });
}

promiseFactory("1")
    .then((res) => {
        res += "2";
        return promiseFactory(res);
    })
    .then((res) => {
        res += "3";
        return promiseFactory(res);
    })
    .then((res) => {
        res += "4";
        return promiseFactory(res);
    })
    .then((res) => {
        res += "5";
        return promiseFactory(res);
    })
    .then((res) => {
        console.log("result:", res);
        console.log('done')
    });

上面代码中两种方法都输出:

1
12
123
1234
12345
result: 12345
done

在第一种写法中可以看到回调层层嵌套,阅读起来十分困难,这还只是个简单的例子,实际中的代码可能涉及多种异步任务相互嵌套,形成回调地狱

​ 在第二种写法中使用了promise,采用链式调用的方式代替嵌套,虽然代码量看起来更多了一些,但在学习了promise的用法之后,阅读起来轻松了许多,更符合人从上到下线性阅读的习惯。而这正是promise诞生的原因。

标签:resolve,JavaScript,reason,promise,result,reject,自顶向下,回调
From: https://www.cnblogs.com/Zonblog/p/16938456.html

相关文章

  • Promise手动实现和Async Await拓展(JavaScript)
    Promise手动实现咱们来看一段Promise的代码:letp1=newPromise((resolve,reject)=>{resolve('成功')reject('失败')![]()})console.log('p1',p1)le......
  • 教你用JavaScript完成轮播图
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个轮播图。图片每3秒自动轮换,也可以点击左右按键轮播图片,当图片......
  • 7种最佳JavaScript日期库
    英文|https://blog.logrocket.com/javascript-date-libraries/从理论上讲,向您的应用程序添加工作日期似乎总是一件容易的事,除非您尝试这样做。总是会遇到麻烦,无论是在尝试......
  • 你必须要知道的JavaScript数据结构与面试题解答
    英文原文|https://dev.to/educative/7-javascript-data-structures-you-must-know-4k0m原文作者|RyanThelin和AmandaFawcett译文翻译|web前端开发(web_qdkf)解决编码......
  • 如何使用函数式编程写更简洁的JavaScript代码
    英文| https://dev.to/r0r71z/javascript-write-cleaner-code-with-functional-programming-279a翻译|web前端开发(ID:web_qdkf)作为一个Web全栈开发人员,我花了很多时间......
  • 这8个很棒的JavaScript测试库,你可以尝试用起来
    英文| https://medium.com/better-programming/8-awesome-javascript-testing-libraries-43e09141fdc2翻译|web前端开发(ID:web_qdkf)测试代码是任何大型公司或项目的强......
  • JavaScript入门①-基础知识筑基
    01、JavaScript基础知识JavaScript(缩写:JS)是一种具有面向对象能力的、解释型的程序语言,基于对象和事件驱动,具有相对安全性的客户端脚本语言。JavaScript是一门完备的动态......
  • 10个 JavaScript 开发小技巧
    英文| https://www.geeksforgeeks.org/javascript-top-10-tips-and-tricks/?ref=rp翻译|web前端开发(ID:web_qdkf)对于Web开发或跨平台开发,JavaScript越来越流行。以前,它......
  • JavaScript中常用数据类型,你知道几个?
    作者|慕课网精英讲师Lison这篇文章我们了解一下JavaScript中现有的八个数据类型,当然这并不是JavaScript中的所有数据类型,而是现在版本的TypeScript支持的基本类型,在......
  • JavaScript创建对象的3种不同方式
    JavaScript是一种灵活的面向对象的语言。在本文中,我们将看到3种不同的JavaScript创建对象的方法。在此之前,重要的是要注意JavaScript是一种无类语言,并且这些函数以某种方式......