x不是对象或函数,则用x完成promise; * 2.1 Promise的决议状态是不能变的,一旦决议了,就不能再进行决议,所以这里要先判断promise是否已经决议 */...执行fun函数 try { fun(resolve, reject); } catch (error) { // 这里需要捕获fun函数执行过程中可能出现的错误;如果fun函数执行出错...Promise.prototype.then 为什么把 then 单独从原型方法中拎出来,主要还是因为他是除了 Promise 决议逻辑之外的另一个重难点,所以想单独讲解。...都必须作为函数调用(采用默认调用方式,而非call、apply或者属性的方式) let x = onFulfilled(this.value); // Promises...{ try { // Promises/A+:2.2.5 onFulfilled和onRejected都必须作为函数调用(采用默认调用方式,而非call、apply或者属性的方式
函数 let resolve = (data)=>{ //这里pendding,主要是为了防止executor中调用了两次resovle或reject方法,而我们只调用一次...>{ setTimeout(()=>{ //因为穿透值的缘故,在默认的跑出一个error后,不能再用下一个的reject来接受,只能通过try,catch...2.为什么外面要包一层setTimeout?:因为Promise本身是一个异步方法,属于微任务一列,必须得在执行栈执行完了在去取他的值,所以所有的返回值都得包一层异步setTimeout。...3.为什么开头有两个判断?:这就是之前想要解决的如果then函数中的参数不是函数,那么我们需要做处理。...5.为什么要递归去调用resolvePromise函数?
; 在 promise 完成之前不能调用它; 它不能被多次调用; onRejected 要求如下: 必须在 promise 被拒绝后调用它,以 promise.reason 作为它的第一个参数; 在 promise...所以 resolvePromise 中不能访问到 promise2,在当前的执行上下文栈中,onFulfilled 或 onRejected 是不能被直接调用的,onFulfilled 或 onRejected...输出结果为: 成功符合预期! 4. 异步事件 Promises/A+ 规范 要求 onFulfilled、onRejected 在执行上下文堆栈之前不得调用。也就是3.1.1标明要注意的点。...4.1 事件队列 当遇到一个异步事件后,并不会一直等待异步事件返回结果,而是会将这个事件挂在与执行栈不同的队列中,我们称之为事件队列。 当所有同步任务执行完成后,系统才会读取”事件队列”。...是不能被直接调用的 // onFulfilled 或 onRejected 得是在当前事件循环后异步执行的 // 可以使用 setTimeout、setImmediate、MutationObserever
我们可以使用 Promise 构造函数将回调转换为 Promise。 Promise 构造函数接受一个回调,带有两个参数resolve和reject。...Resolve:是在异步操作完成时应调用的回调。 Reject:是发生错误时要调用的回调函数。 构造函数立即返回一个对象,即 Promise 实例。...因此,以下所有内容都将被调用。 输出将是 then#1 then#2 then#3 Promise catch Promise .catch方法将函数作为参数处理错误。...假设是从两个不同的api中轮询数据。如果它们不相关,我们可以使用Promise.all()同时触发这两个请求。 在此示例中,主要功能是将美元转换为欧元,我们有两个独立的 API 调用。...它执行Promises并将其添加到队列中。 如果队列小于并发限制,它将继续添加到队列中。 达到限制后,我们使用Promise.race等待一个承诺完成,因此可以将其替换为新的承诺。
所以 代码中的reject('error'); 不会有作用。 Promise 只能 resolve 一次,剩下的调用都会被忽略。...对象,状态为resolved,Promise.resolve 方法的参数,会同时传给回调函数。...,2秒执行一次 green 函数,1秒执行一次 yellow 函数,不断交替重复亮灯,意思就是按照这个顺序一直执行这3个函数,这步可以就利用递归来实现。...答案 // 保存数组中的函数执行后的结果 var data = []; // Promise.resolve方法调用时不带参数,直接返回一个resolved状态的 Promise...) 也会作为参数,传入下次调用的 then 方法中。
then我们已经拿出来了then = value.then,直接调用then(),this就指向的window // 为什么后面还需要绑定两个函数了 // 根据原生的...Promise可知,thenable中的then函数可以接受两个函数resolve,reject // 只有手动调用了resolve和reject才会执行后面的.then操作,具体大家自己操作下..., x)来处理,就跟上面的 resolve 一样处理,注意如果函数什么都没有返回,就是返回的 undefined promise1.then 函数中的两个回调函数只要有一个报错,那么直接调用 promise2....then 函数中的错误回调 如果 promise1.then 的第一个回调不是函数,并且 promise1 调用的是 resolve,那么 promise2.then 的第一个回调参数是 promise1...中 resolve 函数的抛出值 同理,如果 promise1.then 第二个回调不是函数,并且 promise1 调用的是 reject,那么 promise2.then 中的错误回调就会执行 思考
, reject) => { resolve("同步任务执行") }); 为什么呢?...因为是同步任务,所以当我们的promise实例reslove时,它的then方法还没执行到,所以回调函数还没注册上,这时reslove中调用成功回调肯定会报错的。...只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,如果改变已经发生了,你再对promise对象添加回调函数,也会立即得到这个结果。 目标 实现promise的三种状态。...== 'function') { //2.3.3.3 如果 then 是一个函数,以x为this调用then函数,且第一个参数是resolvePromise,第二个参数是rejectPromise...== 'function') { //2.3.3.3 如果 then 是一个函数,以x为this调用then函数,且第一个参数是resolvePromise,第二个参数是rejectPromise
我们可以使用 Promise 构造函数将回调转换为 Promise。 Promise 构造函数接受一个回调,带有两个参数resolve和reject。...Resolve:是在异步操作完成时应调用的回调。 Reject:是发生错误时要调用的回调函数。 构造函数立即返回一个对象,即 Promise 实例。...因此,以下所有内容都将被调用。输出将是 then#1 then#2 then#3 Promise catch Promise .catch方法将函数作为参数处理错误。...假设是从两个不同的api中轮询数据。如果它们不相关,我们可以使用Promise.all()同时触发这两个请求。 在此示例中,主要功能是将美元转换为欧元,我们有两个独立的 API 调用。...它执行Promises并将其添加到队列中。如果队列小于并发限制,它将继续添加到队列中。达到限制后,我们使用Promise.race等待一个承诺完成,因此可以将其替换为新的承诺。
对上面的代码实现做一点简要说明(其它一些内容注释中已经写得很清楚): onFulfilled 和 onFulfilled的调用需要放在setTimeout,因为规范中表示: onFulfilled or...在 resolvePromise 的函数中,为何需要usedd这个flag,同样是因为规范中明确表示: If both resolvePromise and rejectPromise are called...,参数是promise的value 2.2.2.2 在promise的状态不是 fulfilled 之前,不能调用 2.2.2.3 onFulfilled 只能被调用一次 2.2.3 如果 onRejected...之前,不能调用 2.2.3.3 onRejected 只能被调用一次 2.2.4 onFulfilled 和 onRejected 应该是微任务 2.2.5 onFulfilled 和 onRejected...的原因是根据原生Promise对象执行的结果推断的,如下的测试代码,原生的执行结果为: 20 400 30;为了同样的执行顺序,增加了setTimeout延时。
这么说可能不清楚,不妨仿照第一道题的方式,看能不能用同样的方法分析这段代码。...前面说过,await 后面的操作可以放在一个 then 的回调里,所以可以把 readAll 函数近似改写为: async function readAll(paths){ const promises...函数,进入函数执行栈;通过 map 迭代数组,每一次迭代会立即执行 Promise 中的执行器,进而执行 readFile 函数,由于 resolve 是位于异步回调函数中(尚未执行),所以这里返回的是一个处于...接着遇到了 Promise.resolve(promises[0]),这里实际上也是一个处于 pending 状态的 Promise,调用它的 then 方法的时候,会把回调分发到微任务队列。...不过,为什么一开始会猜想出错误的结果呢?= = 其实是因为忘记对 for...of 中的 await 进行转化(被自己菜哭)。
this.onRejectedCallback = [] // rejected的回调函数 const resolve = (value)=>{ if(this.state ==...,当上一个promise对象为fulfilled时调用第一个回调函数,rejected调用第二个回调函数 then需要返回一个新的promise对象并且返回和上一个promise对象resolve或者rejected...any // 只要有一个能resolve就直接resolve,全部reject才reject static any(promises) { return new myPromise...finally对于上一个promise对象无论他的值为什么都要调用其回调函数 并且要返回其对应的resolve或者rejected对应的值 allSettled static allSettled(promises...}) } allSettled接受一个数组为参数 当数组中所有元素的状态都发生变更时才会调用其内部的回调并返回一个新的promise对象 返回的对象只要发生状态变更一定是fulfilled 尾声
1、实现resolve与reject 大家要注意:Promise的初始状态是pending 这里很重要的一步是resolve和reject的绑定this,为什么要绑定this呢?...执行成功回调,为rejected执行失败回调 如resolve或reject在定时器里,则定时器结束后再执行then then支持链式调用,下一次then执行受上一次then返回值的影响 下面咱们就一步一步地去实现他吧...') }, 1000) }).then(res => console.log(res), err => console.log(err)) 我们不能确保1秒后才执行then函数,但是我们可以保证..., reject) => { setTimeout(() => { resolve('成功') // 1秒后输出 成功 // resolve('成功') // 1...链式调用 then支持链式调用,下一次then执行受上一次then返回值的影响,给大家举个例子: // 链式调用 输出 200 const p3 = new Promise((resolve, reject
Promises期约 挑战1 问题: 让我们从复习异步函数开始吧!使用setTimeout,在1000ms后打印字符串“Hello!”。...在promise被调用resolve后,打印它的内容,借助传入console.log到.then中来实现。...为什么?...; 挑战5 问题: 编写delay函数,用于返回一个promise。此返回promise应该返回一个在1000ms后调用resolve的setTimeout。...delay().then(sayHello); 挑战6 问题: 在这个挑战中我们会使用.then链式调用promises期约。
5.当调用 onRejected 函数时,会将当前 Promise 的 reason 失败原因作为参数传入。 6.then 函数的返回值为 Promise。...3.x 是对象或函数 取出 x.then 并调用,调用时将 this 指向 x。将 then 回调函数中得到的结果 y 传入新的 Promise 解决过程中,递归调用。...我们可以将 onFulfilled 和 onRejected 函数存到 Promise 的属性 onFulfilledFn 和 onRejectedFn 中, 当状态改变时分别调用它们。...2.resolve() 和 reject() 函数改变状态时,需要异步调用数组中的函数,同样使用 setTimeout 来模拟异步。...回调函数中得到的结果 y 传入新的 Promise 解决过程中,递归调用。
内部会调用方法,如果方法是promise,需要等待它完成 // 如果当前promise执行时失败了,会把err传递到,err的回调函数中 return Promise.resolve(callback...,失败就不能成功) * */// function read(data) {// return new myPromise((resolve,reject)=>{// setTimeout...,reject)=>{ setTimeout(() => { // 模拟接口调用 ajax调用超时 resolve('成功') }, 10000);})function promiseWrap...全局事件总线,严格来说不能说是观察者模式,而是发布-订阅模式。它在我们日常的业务开发中应用非常广。...我们可以把它理解为一个事件中心,我们所有事件的订阅/发布都不能由订阅方和发布方“私下沟通”,必须要委托这个事件中心帮我们实现。
,调用其 resolve 变更状态,在这个 resolve 里会依次调用 callbacks 里的回调,这样就执行了 then 里的方法了启后:上一步中,当 then 里的方法执行完成后,返回一个结果,...实现步骤:首先获取类型的原型然后获得对象的原型然后一直循环判断对象的原型是否等于类型的原型,直到对象原型为 null,因为原型链最终为 null具体实现:function myInstanceof(left...内部会调用方法,如果方法是promise,需要等待它完成 // 如果当前promise执行时失败了,会把err传递到,err的回调函数中 return Promise.resolve(callback...初始是 pending 状态,可以通过函数 resolve和 reject ,将状态转变为 resolved或者 rejected 状态,状态一旦改变就不能再次变化。...,失败就不能成功) * */// function read(data) {// return new myPromise((resolve,reject)=>{// setTimeout
领取专属 10元无门槛券
手把手带您无忧上云