"use strict"/* 工具类方法 */var def = function def(obj, key, value) {Object.defineProperty(obj, key, {value,writable: true,configurable: true,enumerable: false})}/* Promise核心代码 */function Promise(executor) {var self = thisif (!(self instanceof Promise)) throw new TypeError("Promise constructor cannot be invoked without 'new'")if (typeof executor !== "function") throw new TypeError("Promise resolver is not a function")// 给实例设置私有属性「状态 & 值」def(self, 'state', 'pending')def(self, 'result', undefined)def(self, 'onfulfilledCallback', [])def(self, 'onrejectedCallback', [])// 修改实例状态和值的方法var change = function change(state, result) {if (self.state !== "pending") returnself.state = stateself.result = result// 状态修改完毕,要把之前存储的onfulfilled/onrejected执行var callbacks = state === 'fulfilled' ? self.onfulfilledCallback : self.onrejectedCallbacksetTimeout(function () {callbacks.forEach(function (callback) {callback(self.result)})})}// 立即执行 executor 函数try {executor(function resolve(value) {change('fulfilled', value)},function reject(reason) {change('rejected', reason)})} catch (err) {// 如果 executor 函数执行报错了,则修改实例状态是失败,值是报错的原因change('rejected', err)}}/* Promise.prototype */var proto = Promise.prototypedef(proto, "then", function then(onfulfilled, onrejected) {var self = thisif (!(self instanceof Promise)) throw new TypeError("Method Promise.prototype.then called on incompatible receiver #<Promise>")// 根据现有实例的状态,做不同的处理switch (self.state) {case 'fulfilled':setTimeout(function () {onfulfilled(self.result)})breakcase 'rejected':setTimeout(function () {onrejected(self.result)})breakdefault:self.onfulfilledCallback.push(onfulfilled)self.onrejectedCallback.push(onrejected)}})/* static Promise */def(Promise, "all", function all(promises) {// 确保promises是一个数组「内置all方法:要求promises必须具备迭代器规范」if (!Array.isArray(promises)) throw new TypeError("promises is not a array")// 返回一个总的实例return new Promise(function (resolve, reject) {var count = 0,len = promises.length,values = []// 迭代promises集合中的每一项,根据每一项的状态和值,来决定总实例的状态和值for (var i = 0; i < len; i++) {(function (i) {var promise = promises[i]// 如果循环这一项不是实例,则把其变为状态是成功,值是本身的实例if (!(promise instanceof Promise)) promise = Promise.resolve(promise)promise.then(function (value) {// 只要有一项是成功的,则计数器累加count++values[i] = value// 等待所有项都成功,总实例才是成功的if (count >= len) resolve(values)}).catch(function (reason) {// 只要有一项是失败的,则总实例就是失败的,值就是失败项的值reject(reason)})})(i);}})})
![P]RRD70)WCV]Y4%7663EI4.jpg
