/* * @Author: Marte * @Date: 2018-09-26 18:28:43 * @Last Modified by: Marte * @Last Modified time: 2018-10-31 23:51:36 */ (function(window){ // 参考Joe-Xie:https://www.cnblogs.com/XieJunBao/p/9156134.html // 原生封装promise为了应对低版本浏览器不兼容问题 // 异步串行思路:promise执行then是注册回调函数,then有多个就可以注册多个回调函数,但是若多个回调都是异步执行的,那我们要等上一个异步结束后才执行下一个异步,这是时候就需要上一个异步操作完成后,把这个完成状态告诉下一个回调,这样才可以异步串行。为了解决这个问题我们把异步完成状态托管给promise去管理 // 流程:第一步注册:链式调用then函数,每执行一个then函数,返回一个桥梁promise(then函数中的成功回调和失败回调是写入这个promise的回调列表中的,注意成功回调的功能除了执行本身函数外还要更新下一个promise的状态) // 第二步执行:第一个promise的异步执行完,开始执行第一个promise的回调函数(回调函数又分两步走:第一步:resolvePromise解析回调返回值(如果是promise则说明是异步,就需要继续解析直到不是promise而是一个具体的值),第二步:当回调返回的值是一个具体值而不是promise时,调用第二个proomise的reslove方法将第二个proomise的状态更新为fulfilled,并将第一个promise的回调的值传入p2的回调函数中去执行) function MyPromise(fn) { var self = this; // 成功回调传的参数 self.value = null; // 失败回调传的参数 self.error = null; // 当前promise对象的状态 self.status = "pending"; // 存储成功回调列表 self.onFulfilledCallbacks = []; // 存储失败回调列表 self.onRejectedCallbacks = []; // 状态改变并执行回调 // 成功 function resolve(value) { // 判断传入参数是否由MyPromise构造的对象,若是,注册该函数 if (value instanceof MyPromise) { return value.then(resolve, reject); } // 判断 if (self.status === "pending") { setTimeout(function(){ self.status = "fulfilled"; self.value = value; // 执行成功回调 // self.onFulfilledCallbacks.forEach(function(callback){callback(self.value)}); // 向下兼容forEach for(var i=0;i