首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

按照 PromiseA+ 手写Promise,通过promises-aplus-tests的全部872个测试用例

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或者属性的方式

95630
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    手写系列-这一次,彻底搞懂 Promise

    ; 在 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

    23730

    手写系列-这一次,彻底搞懂 Promise

    ; 在 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

    41530

    初学者应该看的JavaScript Promise 完整指南

    我们可以使用 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等待一个承诺完成,因此可以将其替换为新的承诺。

    3.3K30

    这次彻底搞懂 Promise(手写源码多注释篇)

    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 中的错误回调就会执行 思考

    62021

    从零开始写一个符合PromisesA+规范的promise

    , 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

    1.5K20

    一个小白的角度看JavaScript Promise 完整指南

    我们可以使用 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等待一个承诺完成,因此可以将其替换为新的承诺。

    3.6K31

    带你写出符合PromiseA+规范Promise的源码

    对上面的代码实现做一点简要说明(其它一些内容注释中已经写得很清楚): 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延时。

    87220

    记得有一次面试被虐的题,Promise 完整指南

    我们可以使用 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等待一个承诺完成,因此可以将其替换为新的承诺。

    2.3K20

    记两道关于事件循环的题

    这么说可能不清楚,不妨仿照第一道题的方式,看能不能用同样的方法分析这段代码。...前面说过,await 后面的操作可以放在一个 then 的回调里,所以可以把 readAll 函数近似改写为: async function readAll(paths){ const promises...函数,进入函数执行栈;通过 map 迭代数组,每一次迭代会立即执行 Promise 中的执行器,进而执行 readFile 函数,由于 resolve 是位于异步回调函数中(尚未执行),所以这里返回的是一个处于...接着遇到了 Promise.resolve(promises[0]),这里实际上也是一个处于 pending 状态的 Promise,调用它的 then 方法的时候,会把回调分发到微任务队列。...不过,为什么一开始会猜想出错误的结果呢?= = 其实是因为忘记对 for...of 中的 await 进行转化(被自己菜哭)。

    39420

    从零开始写一个符合PromisesA+规范的promise

    , 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

    1K10

    带你手写Promise身上的几个方法,拷打面试官

    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 尾声

    10910

    看了就会,手写Promise原理,最通俗易懂的版本!!!

    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

    68210

    社招前端经典手写面试题合集

    内部会调用方法,如果方法是promise,需要等待它完成 // 如果当前promise执行时失败了,会把err传递到,err的回调函数中 return Promise.resolve(callback...,失败就不能成功) * */// function read(data) {// return new myPromise((resolve,reject)=>{// setTimeout...,reject)=>{ setTimeout(() => { // 模拟接口调用 ajax调用超时 resolve('成功') }, 10000);})function promiseWrap...全局事件总线,严格来说不能说是观察者模式,而是发布-订阅模式。它在我们日常的业务开发中应用非常广。...我们可以把它理解为一个事件中心,我们所有事件的订阅/发布都不能由订阅方和发布方“私下沟通”,必须要委托这个事件中心帮我们实现。

    74940

    前端二面手写面试题总结

    ,调用其 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

    82320
    领券