We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
setTimeout(function(){ var a=100; console.log(a); setTimeout(function () { var b=200; console.log(b) setTimeout(function () { var c=300; console.log(c) }, 1000); }, 1000); },1000);
new Promise(function (resolve, reject) { setTimeout(function () { var a=100; resolve(a); }, 1000); }).then(function (res) { console.log(res); return new Promise(function (resolve, reject) { setTimeout(function () { var b=200; resolve(b); }, 1000); }) }).then(function (res) { console.log(res); return new Promise(function (resolve, reject) { setTimeout(function () { var c=300 resolve(c); }, 1000); }) }).then(function (res) { console.log(res); } )
/* 我们要满足状态只能三种状态:PENDING,FULFILLED,REJECTED三种状态,且状态只能由PENDING=>FULFILLED,或者PENDING=>REJECTED */ var PENDING = 0; var FULFILLED = 1; var REJECTED = 2; /* value状态为执行成功事件的入参,deferreds保存着状态改变之后的需要处理的函数以及promise子节点,构造函数里面应该包含这三个属性的初始化 */ function Promise(callback) { this.status = PENDING; this.value = null; this.defferd = []; setTimeout(callback.bind(this, this.resolve.bind(this), this.reject.bind(this)), 0); } Promise.prototype = { constructor: Promise, //触发改变promise状态到FULFILLED resolve: function (result) { this.status = FULFILLED; this.value = result; this.done(); }, //触发改变promise状态到REJECTED reject: function (error) { this.status = REJECTED; this.value = error; }, //处理defferd handle: function (fn) { if (!fn) { return; } var value = this.value; var t = this.status; var p; if (t == PENDING) { this.defferd.push(fn); } else { if (t == FULFILLED && typeof fn.onfulfiled == 'function') { p = fn.onfulfiled(value); } if (t == REJECTED && typeof fn.onrejected == 'function') { p = fn.onrejected(value); } var promise = fn.promise; if (promise) { if (p && p.constructor == Promise) { p.defferd = promise.defferd; } else { p = this; p.defferd = promise.defferd; this.done(); } } } }, //触发promise defferd里面需要执行的函数 done: function () { var status = this.status; if (status == PENDING) { return; } var defferd = this.defferd; for (var i = 0; i < defferd.length; i++) { this.handle(defferd[i]); } }, /*储存then函数里面的事件 返回promise对象 defferd函数当前promise对象里面 */ then: function (success, fail) { var o = { onfulfiled: success, onrejected: fail }; var status = this.status; o.promise = new this.constructor(function () { }); if (status == PENDING) { this.defferd.push(o); } else if (status == FULFILLED || status == REJECTED) { this.handle(o); } return o.promise; } };
The text was updated successfully, but these errors were encountered:
No branches or pull requests
promise源码分析
初级入门以及如何使用请看 阮一峰promise对象讲解
先上一坨代码,后面我们要基于这坨代码来实现自定义promise
原始方法
promise实现
如何让你的promise能有此魔力
####如何让异步的value在thenable函数中拿到
####如何处理链式的promise且保证顺序
当父promise 状态改变完毕,执行完相应的onfulfiled/onfulfiled的时候呢,拿到子promise,在等待这个子promise状态改变,在执行相应的onfulfiled/onfulfiled。依次循环直到当前promise没有子promise
最终代码(内涵注释)
在附上一张手绘的流程图
参考资料
源码地址
The text was updated successfully, but these errors were encountered: