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

Promise实现原理

我们工作中免不了运用promise用来解决异步回调问题。平时用的很多库或者插件都运用了promise 例如axios、fetch等等。但是你知道promise是咋写出来的呢?...存在三个状态(statepending、fulfilled、rejected pending(等待态)为初始态,并可以转化为fulfilled(成功态)和rejected(失败态) 成功时,不可转为其他状态...onRejected(this.reason); }; // 当状态statepending时 if (this.state === 'pending') { //...秘籍规定了一种方法,就是在then里面返回一个新的promise,称为promise2:promise2 = new Promise((resolve, reject)=>{}) 将这个promise2...(默认返回promise)、x(我们自己return的对象)、resolve、reject resolve和reject是promise2的 class Promise{ constructor(

1.1K20

promise & axios & async_await 关于 Promise

有三种状态,pending(进行中)、resolved(已完成)、rejected(已失败),特点是只有异步操作的结果,可以决定当前是哪一种状态,状态一旦改变,就无法再次改变状态; Promise常用的方法...,返回最先执行结束的 Promise 任务的结果,不管这个 Promise 结果是成功还是失败; (4)all:如果全部成功执行,则以数组的方式返回所有 Promise 任务的执行结果,如果有错误就返回...,后面我们说 【2】为什么出现Promise 业务上遇到一个请求要依赖前一个请求的结果,如果多个层层回调函数的嵌套叫做“回调地域”,代码不美观而且不易于维护,所以Promise出现了他的链式调用可以解决这一个问题...axios本身就是一个promise。...网上很多都是把axios外面又套一层promise那是不科学或者没有理解axios的本质的做法,要知道:axiospromise封装的,本质就是一个promise,所以没必要去套一层promise

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

Vue 前后端交互基础

Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。...Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected。...resolve 函数的作用是,将 Promise 对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject...函数的作用是,将 Promise 对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。   ...实例,当这个数组中的 Promise 实例全部返回时,方法执行结束 race(数组): 接收一个数组,每个数组元素都是一个 Promise 实例,当这个数组中的 Promise 实例有一个返回时,方法执行结束

2.1K50

使用 axios 拦截器解决「 前端并发冲突 」 问题

具体实现 存储所有 pending 状态的请求 首先我们要将项目中所有的 pending 状态的请求存储在一个变量中,叫它 pendingRequests, 可以通过把 axios 封装为一个单例模式的类...)) { config.cancelToken = new axios.CancelToken((cancel) => { // cancel 函数的参数会作为 promise...(error); } ); 在请求返回后维护 pendingRequests 对象 如果请求顺利走到了响应拦截器这一步,说明这个请求已经结束了 pending 状态,那我们要把它从 pendingRequests...return Promise.reject(error); }) 需要清空 pendingRequests 对象的场景 遇到网络波动或者超时等情况造成请求错误时,需要清空原来存储的所有 pending...,对接口报错的情况,可以统一在响应拦截器中添加 toast 给用户提示, 对于特殊的不需要报错的接口,可以设置一个参数存入 axios 拦截器的 config 参数中,过滤掉报错提示: // 接口返回

2K40

如何防止重复发送ajax请求

总之就是wait time的时间设定是个难题 请求拦截和请求取消 作为一个成熟的ajax应用,它应该能自己在pending过程中选择请求拦截和请求取消 请求拦截 用一个数组存储目前处于pending状态的请求...请求取消 用一个数组存储目前处于pending状态的请求。...发送请求时判断这个api请求之前是否已经有还在pending的同类,即是否存在上述数组中,如果存在,则找到数组中pending状态的请求并取消,不存在就将该api添加到数组中。...= promise.then(chain.shift(), chain.shift()); } return promise; }; request方法返回一个链式调用的promise,等同于...我们在项目中,大多都会对axios库再做一层封装来处理一些公共逻辑,最常见的就是在response拦截器里统一处理返回code。

2.5K10

前端网红框架的插件机制全梳理(axios、koa、redux、vuex)

axios 首先我们模拟一个简单的 axios,这里不涉及请求的逻辑,只是简单的返回一个 Promise,可以通过 config 中的 error 参数控制 Promise 的状态。...}); } }; 如果传入的 config 中有 error 参数,就返回一个 rejected 的 promise,反之则返回 resolved 的 promise。...1, // ↓response 响应拦截器// ↓response ] 至于为什么 requestInterceptor 的顺序是反过来的,仔细看看代码就知道 XD。...' } 然后由于失败的拦截器 error => { console.log('error', error) }, 没有返回任何东西,打印出result3: undefined 可以看出,axios...你可能还想看 金九银十:一年前端的面试分享 2020年中大厂前端面试总结 如何学习React源码 如何学习源码 | 如何高效学习一个新知识 为什么要学习源码,怎么学习? 我在阿里招前端,我该怎么帮你?

1.8K30

采用Symbol和process.nextTick实现Promise

处理http请求的axios、gulp4的构建流程、主流的测试框架mocha/ava等等都围绕Promise为开发者量身打造。...Promise状态从pending改变的处理逻辑PromiseHandle。 形成Promise的数据结构NewPromiseCapability。...Promise,pending状态 let newPromise = new SuperPromise((resolve,reject)=>{}); //添加对外接口 newPromise...我们接下来看下如何实现state存储和多级嵌套。 当then(fn)执行的时候,如果是个普通值就直接把promise的值改为那个值即可。...如果fn执行返回的是一个Promise,我们必须把当前的Promise挂钩在返回Promise上面。 要实现后者其实很简单,只需要将当前的Promise挂在fn()的结果后面接口实现依赖关系的转换。

73880

axios笔记(二) 深入了解axios

介绍 前端最流行的 ajax 请求库 react / vue 官方推荐使用 axios 发送 ajax 请求 axios 仓库 2. axios 特点 基于 promise 的异步 ajax 请求库 浏览器端.../node_modules/axios/dist/axios.min.js"> // 添加请求拦截器(回调函数,成功的必须返回config:用于把任务串联起来...cancel === "function") { cancel("取消请求"); } 这里会出现一个问题,如果连续发送三个请求(在收到响应之前),会发现,第三个请求没有取消掉前一个未完成的请求 为什么会这样呢...因为返回一个pending状态的对象时,后续的回调就不能执行了。 // 因为后面的回调函数只有在状态发生变化时才能执行。...因为返回一个pending状态的对象时,后续的回调就不能执行了。 // 因为后面的回调函数只有在状态发生变化时才能执行。

3K10

Koa的洋葱中间件,Redux的中间件,Axios的拦截器,一个精简版的就彻底搞懂了。

axios 首先我们模拟一个简单的axios,这里不涉及请求的逻辑,只是简单的返回一个Promise,可以通过config中的error参数控制Promise的状态。...result: config.result, }); } }; 复制代码 如果传入的config中有error参数,就返回一个rejected的promise,反之则返回resolved的promise...promise return promise; }; 复制代码 从axios.run这个函数看运行时的机制,首先构造一个chain作为promise链,并且把正常的请求也就是我们的请求参数axios..., // ↓response 响应拦截器// ↓response ] 复制代码 至于为什么requestInterceptor的顺序是反过来的,仔细看看代码就知道 XD。...' } 然后由于失败的拦截器 error => { console.log('error', error) }, 复制代码 没有返回任何东西,打印出result3: undefined 可以看出,axios

1.9K10

基于TypeScript封装Axios笔记(八)

添加一个 CancelToken 的对象,它有一个 source 方法可以返回一个 source 对象,source.token 是在每次请求的时候传给配置对象中的 cancelToken 属性,然后在请求发出去之后...我们可以利用 Promise 实现异步分离,也就是在 cancelToken 中保存一个 pending 状态的 Promise 对象,然后当我们执行 cancel 方法的时候,能够访问到这个 Promise...对象,把它从 pending 状态变成 resolved 状态,这样我们就可以在 then 函数中去实现取消请求的逻辑,类似如下的代码: 1if (cancelToken) { 2 cancelToken.promise...接着执行 executor 函数,传入一个 cancel 函数,在 cancel 函数内部,会调用 resolvePromise 把 Promise 对象从 pending 状态变为 resolved...至此,我们完成了 ts-axios 的请求取消功能,我们巧妙地利用了 Promise 实现了异步分离。

66410

axios 是如何封装 HTTP 请求的

从上面的代码中可以看到,axios 的用法与 jQuery 的 ajax 方法非常类似,两者都返回一个 Promise 对象(在这里也可以使用成功回调函数,但还是更推荐使用 Promise 或 await...从上面的代码,我们可以知道:发送请求之前,我们可以对请求的配置参数(config)做处理;在请求得到响应之后,我们可以对返回数据做处理。...当 source 方法正在返回实例 A 的时候,一个处于 pending 状态的 promise 对象初始化完成。...在将实例 A 传递给 axios 之后,promise 就可以作为撤销请求的触发器使用了。...当调用通过 source 方法返回的 cancel 方法后,实例 A 中 promise 状态从 pending 变成 fulfilled,然后立即触发 then 回调函数。

1.9K50
领券