主要是 new Promise 时执行器里面调用 resolve/reject 是同步的if(this.status===RESOLVED){// 使用 setTimeout (宏任务),确保 onFulfilled 和 onRejected 方法异步执行,也确保 promise2 已经定义,// 如果不使用 setTimeout,会导致执行 resolvePromise(promise2, x, resolve, reject) 时...
一、Promise源码实现 定义初始类型 设置初始状态 监听状态变化 resolve 和 reject 方法,这两个方法是要更改status的, 入参分别是value 和 r...
: const test = Promise.resolve<{a: number}>({a: 1, something: 'wrong'});// ^^^−− Argument of type '{ a: number; something: string; }' is not assignable to parameter of type '{ a: number; } | PromiseLike<{ a: number; }>' 在这种情况下,TypeScript将test的类型推断为...
then.call(x,y=>{if(called)return;called=true;// 如果 x 是一个 Promise,那么就继续解析成功的值resolvePromise(promise2,y);},f=>{if(called)return;called=true;reject(f);// 直接调用 r 作为失败的结果});}}catch(err){if(called)return;called=true;reject(err);}}else{resolve(x);}};class...
1,从上往下执行,遇到setTimeout,setInterval等宏任务添加到宏任务队列,遇到promise等微任务添加到微任务队列,同步代码执行完之后,执行微任务队列。 2,执行下一个宏任务,比如setTimeout函数体里面的,先执行同步代码,然后执行微任务代码,遇到宏任务就添加到宏任务队列 ...
promise的异常穿透?(异常穿透是中间任意一个环节错误,都会捕获到错误,并执行.catch方法) 如何中断promise链?在.then方法中return new Promise(()=>{}),即返回一个pending状态的新promise 4.自定义封装 思考 经过两天的学习与测试,完整的封装源码来咯!
Promise.js源码中很重要的一条语句就是最后的fn(resolve) [标记6] 这条语句可以让带有参数的Promise在实例化时自动执行他的参数 同时把resolve传入 注意 这里的resolve如果是then的参数的参数 那往往是Promise的上层堆栈的resolve 这个可以从图三里很好的看出来 而最重要的所谓反转的反转的实现 就在这里! 通过handle...
我们平时都是以new Promise(params)的形式使用Promise的,说明Promise是一个构造函数,那我们就从构造函数为入口来分析Promise-polyfill源码。如下: /** * @constructor * @param {Function} fn */functionPromise(fn){if(!(thisinstanceofPromise))thrownewTypeError('Promises must be constructed via new');if(typ...
从以上代码可以看出,Promise是一个构造函数,实例化之后,可以通过它的then方法【注册】promise异步操作成功时执行的回调,使得异步调用变得非常简单方便。 之所以说是注册,是因为它就是一种【发布订阅模式】。 2、试着实现一个Promise雏形 functionPromise(fn){this._resolves=[]this._rejects=[]}Promise.prototype.then...
==Promise){returnsafeThen(this,onFulfilled,onRejected);}varres=newPromise(noop);handle(this,newHandler(onFulfilled,onRejected,res));returnres;};functionhandle(self,deferred){while(self._state===3){self=self._value;}if(Promise._onHandle){Promise._onHandle(self);}if(self._state===0){if(...