Promise的实现原理
来源:互联网 发布:c语言宏定义 编辑:程序博客网 时间:2024/06/05 07:31
以下是promise的简单实现
var Deferred = function () { this.promise = new Promise();};var Promise = function () { this.queue = []; this.isPromise = true; //判断是否返回了一个promise对象}Promise.prototype.then = function (fulfilledHandler,errorHandler,progressHandler) { var handler = {}; if(typeof fulfilledHandler === 'function'){ handler.fulfilled = fulfilledHandler; } if(typeof errorHandler === 'function'){ handler.error = errorHandler; } this.queue.push(handler); return this;}//生成回调函数Deferred.prototype.callback = function () { var that = this; return function (err,file) { if(err){ return that.reject(err); } that.resolve(file); }}Deferred.prototype.resolve = function (obj) { var promise = this.promise; var handler; while(handler = promise.queue.shift()){ if(handler && handler.fulfilled){ var ret = handler.fulfilled(obj); if(ret &&ret.isPromise){ ret.queue = promise.queue; this.promise = ret; return ret; } } }}Deferred.prototype.reject = function (err) { var promise = this.promise,handler; while(handler = promise.queue.shift()){ if(handler && handler.error){ var ret = handler.error(err); if(ret && ret.isPromise){ ret.queue = promise.queue; this.promise = ret; return ; } } }}
这里我们以两次文件读取为例子,以验证该设计的可行性。这里假设读取第二个文件是依赖于第一个文件中的内容的,相关代码如下:
var readFile1 = function (file,encoding) { var deferred = new Deferred(); fs.readFile(file,encoding,deferred.callback()); return deferred.promise;}var readFile2 = function (file,encoding) { var deferred = new Deferred(); fs.readFile(file,encoding,deferred.callback()); return deferred.promise;}readFile1('file1.txt','utf8').then(function (file1) { return readFile2(file1.trim(),'utf8');}).then(function (file2) { console.log(file2);});
要让Promise支持链式执行,主要通过以下两个步骤
(1)将所有的回调都存放在队列中
(2)Promise完成时,逐个执行回调,一旦检测到返回了新的Promise对象,停止执行,然后将当前
deferred对象的Promise引用改变为新的Promise对象,并将队列中余下的回调转交给它。
这里的代码主要用于研究Promise的执行原理,在更多细节的优化方面,Q或者when等Promise库做得更好,实际应用时请采用这些成熟库。
注意:Promise.prototype.then
的函数实现中return this;
才实现了链式调用,this指代的是当前promise实例。
阅读全文
0 0
- promise的实现原理
- Promise的实现原理
- promise实现原理的源码分析
- Promise实现原理
- 解析 Promise 原理,实现一个Promise
- 【入门】promise的实现
- Promise实现的lazyman
- Promise原理
- JS Promise的简单实现
- Promise实现小球的运动
- 实现一个简单的Promise
- C++异步调用利器future/promise实现原理
- 自己实现一个简单的Promise
- 浅谈Javascript中Promise对象的实现
- 异步编程Promise的简单实现
- 浅谈Javascript中Promise对象的实现
- Promise原理分析一
- Promise原理分析二
- 求列的第一个值
- Mysql中utf8的校对规则
- oj网站的训练题:多个数求和——A+B(基本输入输出5)
- 1073. 多选题常见计分法(20)
- 10.15_总结
- Promise的实现原理
- jena sparql rdf java
- POJ 3041:Asteroids
- ubuntu下安装Apache+PHP+Mysql
- Spring框架中bean的生命周期
- 序列-元组
- opencv视频采集封装qml
- 10.17坑位
- Binary Tree Inorder Traversal--LeetCode