promise面试题

Promise是ES6为解决回调地狱问题引入的一种异步处理方式。它通过链式调用来避免深层嵌套,但仍有改进空间,最终常用的是async/await。Promise有三种状态:进行中、成功和失败,通过resolve和reject改变状态并传递结果。.then和.catch用于接收成功或失败的结果。此外,Promise.all用于合并多个请求,所有请求完成才会继续;Promise.race则在任一请求完成时立即返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先promise是es6提供一种异步解决方案. 通过promise能够解决回调地狱问题. 所谓的这个回调地狱指的当我们执行完一个操作之后在接受着操作的结果只能通过回调函数的方式进行接受,使用回调函数的方式存在的弊端就是写法非常臃肿,并且后期难以维护,所谓es6给我提供了一种新的解决方案,就是promise来进行解决,promise可以通过链式调用的方式来解决层层嵌套的问题,但是写法上也不是非常好,所以我们最终的替代方案是使用async和await

promise一共有三个状态,分别是进行中,成功或者失败 如何成功的话可以通过resolve方法将正确结果返回出去,通过.then的方式进行接受,失败的话可以通过reject的方式将失败的结果返回出去,通过.catch的方式进行接受,pending状态是进行中,一旦进行之后,他的状态是不可逆的

如果要使用promise,我们需要对promise进行实例化,在实例化的构造函数里面有一个回调函数,这个回调函数里面有那个参数,分别是resolve和reject,我们可以通过promise的实例化对象调用.then或者.catch方式接受结果

promise还给我们提供了.all 和 race, 其中all方法的作用是将多个请求合并成一个请求, 比如当首页要请求10个接口,我们可以promise.all进行合并,.race的作用也可以将多个请求合并成一个请求,不过是谁先请求成功就先返回谁.

promise实例

  // 第一步:先写一个函数
  function fetch ( options ){
         // 第二步:实例化promise
        let p = new Promise(( resolve,reject ) => {
          // 第三步:放一个异步操作,我这里放的的是小程序的请求
             wx.request ({
               url: options.url,
               data: o
### 关于 Promise 的常见面试题及解答 #### 1. 创建并返回一个立即解析的 Promise 对象 创建一个立即被解析为给定值的 `Promise` 对象。 ```javascript const immediateResolve = value => { return new Promise(resolve => resolve(value)); }; immediateResolve(42).then(console.log); // 输出: 42 ``` 此方法展示了如何通过构造函数快速构建已成功状态下的承诺对象[^2]。 #### 2. 处理多个并发 Promises 并收集所有结果 当需要等待一组异步操作完成时可以使用 `Promise.all()` 方法来处理这些情况。该方法接收一个由 promises 组成的数组作为参数,并返回一个新的 promise,这个新的 promise 将会在所有的输入 promises 被解决之后才会被解决,并且会把所有输入 promises 结果组成的一个列表传递给其回调函数。 ```javascript function fetchMultipleUrls(urls) { const requests = urls.map(url => fetch(url).then(response => response.json()) ); return Promise.all(requests); } fetchMultipleUrls(['url1', 'url2']).then(dataList => console.log(dataList)); // 所有请求完成后打印数据集合 ``` 这段代码说明了怎样利用 `Promise.all()` 来有效地管理多任务的同时执行以及获取它们的结果集。 #### 3. 实现带有重试机制的 Promise 函数 对于某些可能失败的操作来说,提供一种自动重新尝试的能力是非常有用的。下面是一个简单的例子,实现了具有指定次数重试功能的通用工具函数: ```javascript function retryPromise(cb, retriesLeft = 3, interval = 1000) { return new Promise((resolve, reject) => { cb().then( res => resolve(res), err => { setTimeout(() => { if (retriesLeft === 1) { reject(err); return; } retryPromise(cb, retriesLeft - 1, interval).then(resolve, reject); }, interval); } ); }); } ``` 上述实现允许传入自定义的最大重试次数和每次重试之间的间隔时间,从而提高了灵活性与实用性[^3]。 #### 4. 使用 catch() 捕获错误 如果任何一个链接中的 promise 发生拒绝,则整个链条都会跳转至最近一次调用 `.catch()` 或者后续任何地方设置的错误处理器那里去继续运行流程。 ```javascript new Promise((_, reject) => { throw "Oops!"; }).catch(error => { console.error('Caught error:', error); // Caught error: Oops! }); ``` 这里展示了一个基本的例子,其中抛出了异常并且被捕获到了链上的第一个可用的`.catch()` 中[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值