链式调用
链式调用是常见的js一种函数方式,我们看看他是如何实现的
1 | /** |
js版本 sleep 函数
sleep 函数,作用是使程序暂停指定的时间,其他语言自带sleep函数,而JS却需要稍微改造一下,已实现sleep函数
1 |
|
发布订阅者模式
这是经典的一个开发模式,很多场景以及sdk会使用它
1、创建一个 EventEmitter 类
2、在该类上创建一个事件中心(Map)
3、on 方法用来把函数 fn 都加到事件中心中(订阅者注册事件到调度中心)
4、emit 方法取到 arguments 里第一个当做 event,根据 event 值去执行对应事件中心中的函数(发布者发布事件到调度中心,调度中心处理代码)
5、off 方法可以根据 event 值取消订阅(取消订阅)
6、once 方法只监听一次,调用完毕后删除缓存函数(订阅一次)
7、注册一个 newListener 用于监听新的事件订阅
1 |
|
手写Promise函数
Promise的出现解决了之前回调地狱的状况。
基本概念:
- Promise三个状态: pending、fulfilled、 rejected.默认状态pending
- new Promise接受 executor()执行器,内含参数 resolve和reject
- 状态单向变更且无法更改
- promise 必须有一个then方法,then 接收两个参数,分别是 promise 成功的回调 onFulfilled, 和 promise 失败的回调 onRejected;
- 如果调用 then 时,promise 已经成功,则执行onFulfilled,参数是promise的value;
- 如果调用 then 时,promise 已经失败,那么执行onRejected, 参数是promise的reason;
- 如果 then 中抛出了异常,那么就会把这个异常作为参数,传递给下一个 then 的失败的回调onRejected;
- catch() 方法返回一个Promise,并且处理拒绝的情况。我们知道then方法的第二个参数其实就是干这个用的,catch只是一个别名。
- finally和catch方法只是then的一个别名,实际上返回的还是一个promise,完全可以这样写:promise.then().finally().then().catch().then()
按照这个思路,我们实现Promise
1 |
|
上述写法通过观察者模式,该模式一般为 收集依赖 -》触发通知 =》执行依赖,在 Promise 中执行顺序为 then收集依赖 - 异步出发 - resolve - resolve执行依赖
手写Promise.all
Promise是常用的异步处理方式,他有 all、allSettled、race 三个方法
共同点: 都是将多个Promise组合成一个返回
不同点: race 谁先返回谁先输出;all 只有有一个失败及全部失败,全部成功才会返回;allSettled 不管是否成功都会返回,且每个返回携带 Promise 状态。
这里我们实现 Promise.all 函数
核心思路!: 返回一个大Promise,然后遍历内部promise函数,执行成功计数器加一,全部执行完毕则返回
1 |
|