JavaScript之Promise实现
来源:互联网 发布:node.js能做什么 编辑:程序博客网 时间:2024/06/04 17:47
ES2015提出了Promise
,同时基于Promise
的异步开发将开发者中回调地狱中解救出来。但在没有原生支持的环境下,需要借助Promise/A+
之类的库来实现Promise
,今天就来尝试自行实现Promise。
1 基本实现
首先来完成一个Promise
类的基本框架:
function Promise(fn) { var resolveCallback = null var rejectCallback = null this.then = function(onResolved, onRejected) { resolveCallback = onResolved rejectCallback = onRejected } this.resolve = function(value) { this.resolveCallback(value) } this.reject = function(reason) { this.rejectCallback(reason) } fn(this.resolve, this.reject)}
以上便是Promise
的基本实现。
2 状态管理
上述的代码存在一个问题,resolve方法会调用多次,所以接下来我们需要接入状态管理。
Promise
内部存在3个状态:
- pending
- resolved
- rejected
接下来在现有代码之上,加入状态管理:
function MyPromise(fn) { let state = 'pending' var resolveCallback = null var rejectCallback = null var childResolve var childReject this.then = function(onResolved, onRejected) { resolveCallback = onResolved rejectCallback = onRejected } this.resolve = function(value) { if(state === 'pending') { this.resolveCallback(value) state = 'resolved' } } this.reject = function(reason) { if(state === 'pending') { this.rejectCallback(reason) state = 'rejected' } } fn(this.resolve, this.reject)}
3 链式调用
上述Promise
实现可以完成正常的异步调用,但是却无法实现链式回调,原因在于其then
方法没有返回一个新的Promise
对象,所以接下来还需要改造then
方法,实现链式调用:
this.then = function(onResolved, onRejected) { if(state === 'pending') { resolveCallback = onResolved rejectCallback = onRejected } return new MyPromise((resolve, reject) => { ...... }) }
光返回一个promise
对象还没用,接下来我们来写个demo测试下:
var demo = new MyPromise((resolve, reject) => { setTimeout(() => { resolve('my first promise') }, 1000) }) demo.then((msg) => { console.log(msg) return 'my second promise' }).then((msg) => { console.log(msg) })
其输出为:
my first promise
事实上,第二个promise对象的resolve
reject
方法从未被调用过,因而其onResolved
onRejected
的回调ye就无从调用。所以还必须指定时机调用字promise
对象的resolve
和reject
。
所以首先需要在创建新promise
对象时,记录其resolve
和reject
方法:
function MyPromise() { ...... var childResolve var childReject this.then = function(onResolved, onRejected) { if(state === 'pending') { resolveCallback = onResolved rejectCallback = onRejected } return new MyPromise((resolve, reject) => { childResolve = resolve childReject = reject }) }}
接下来还需在resolve
和 reject
方法中调用子对象的resolve
和reject
方法,整个Promise
完整代码如下:
function MyPromise(fn) { let state = 'pending' var resolveCallback = null var rejectCallback = null var childResolve = null var childReject = null this.then = function(onResolved, onRejected) { if(state === 'pending') { resolveCallback = onResolved rejectCallback = onRejected } return new MyPromise((resolve, reject) => { childResolve = resolve childReject = reject }) } this.resolve = function(value) { if(state === 'pending') { if(resolveCallback) { var ret = resolveCallback(value) childResolve(ret) state = 'resolved' } } } this.reject = function(reason) { if(state === 'pending') { if(rejectCallback) { var ret = rejectCallback(reason) childReject(ret) state = 'rejected' } } } fn(this.resolve, this.reject) }
阅读全文
0 0
- JavaScript之Promise实现
- JavaScript基础之Promise
- JavaScript异步之Promise
- JavaScript:Defer/Promise轻量级实现
- JavaScript Promise 实现(一)
- JavaScript Promise 实现(二)
- JavaScript Promise 实现(三)
- javascript异步下载 Promise实现
- (转载)Javascript 之 Promise
- JavaScript杂谈之promise揭秘
- 浅谈Javascript中Promise对象的实现
- JavaScript简单实现Promise/A+规范
- 浅谈Javascript中Promise对象的实现
- 【windows8开发】异步编程之Promise(Javascript)
- 【windows8开发】异步编程之Promise(Javascript)
- Javascript中异步编程之Promise
- 深入理解javascript之初识promise
- javascript系列之使用Promise封装ajax
- CodeForces
- 内排序- 当有两种以上变元的时候的贪心算法
- Gym
- deeplearn.js API用例(二)softmax的手动实现(解决Softmax backprop is not yet implemented问题)
- C++ STL容器之map操作
- JavaScript之Promise实现
- 数据结构--树、森林和二叉树的转换
- 形参和实参是什么?
- Java实现平衡二叉树(AVL树)
- opencv3/C++图像滤波实现
- 区分识别机器学习中的分类与回归
- Android 利用Zxing实现扫描二维码并跳转详情页面
- ajax spring security 被误伤
- Nginx压缩模块