返回

寒冬三年经验面试试炼:Promise篇手写题精粹

见解分享

如何在面试中驾驭 Promise 手写题:必备知识和解答

准备手写题:不可或缺

无论寒冬酷暑,求职前做足准备至关重要。作为拥有三年面试经验的前端工程师,我深知手写题是求职环节中一个相对容易准备的部分。大多数公司考察的题目都集中在一定范围内,因此,针对性地准备手写题,可以大幅提高你的面试成功率。

Promise:异步编程的利器

Promise 是 JavaScript 中处理异步编程的利器,在面试中经常被用来考察求职者的异步编程能力。下面,我们就来探讨一些常见的面试题:

1. 实现一个 Promise

实现一个 Promise 类的代码如下:

function myPromise(executor) {
  this.status = 'pending';
  this.value = undefined;
  this.reason = undefined;
  this.onFulfilledCallbacks = [];
  this.onRejectedCallbacks = [];

  const resolve = (value) => {
    if (this.status !== 'pending') return;
    this.status = 'fulfilled';
    this.value = value;
    this.onFulfilledCallbacks.forEach(cb => cb(value));
  };

  const reject = (reason) => {
    if (this.status !== 'pending') return;
    this.status = 'rejected';
    this.reason = reason;
    this.onRejectedCallbacks.forEach(cb => cb(reason));
  };

  try {
    executor(resolve, reject);
  } catch (error) {
    reject(error);
  }
}

2. Promise 的 then 方法

Promise 的 then 方法用于添加回调函数,处理 Promise 的结果。它的代码实现如下:

Promise.prototype.then = function(onFulfilled, onRejected) {
  return new Promise((resolve, reject) => {
    if (this.status === 'fulfilled') {
      setTimeout(() => {
        try {
          const result = onFulfilled(this.value);
          resolvePromise(result, resolve, reject);
        } catch (error) {
          reject(error);
        }
      }, 0);
    } else if (this.status === 'rejected') {
      setTimeout(() => {
        try {
          const result = onRejected(this.reason);
          resolvePromise(result, resolve, reject);
        } catch (error) {
          reject(error);
        }
      }, 0);
    } else {
      this.onFulfilledCallbacks.push(onFulfilled);
      this.onRejectedCallbacks.push(onRejected);
    }
  });
};

3. Promise 的 catch 方法

Promise 的 catch 方法用于处理 Promise 拒绝时的回调函数,其代码实现如下:

Promise.prototype.catch = function(onRejected) {
  return this.then(undefined, onRejected);
};

4. Promise.all

Promise.all 用于处理多个 Promise 并行执行的情况,其代码实现如下:

Promise.all = function(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let count = 0;
    for (let i = 0; i < promises.length; i++) {
      promises[i].then(value => {
        results[i] = value;
        count++;
        if (count === promises.length) {
          resolve(results);
        }
      }).catch(reason => {
        reject(reason);
      });
    }
  });
};

5. Promise.race

Promise.race 用于处理多个 Promise 竞争执行的情况,其代码实现如下:

Promise.race = function(promises) {
  return new Promise((resolve, reject) => {
    for (let i = 0; i < promises.length; i++) {
      promises[i].then(value => {
        resolve(value);
      }).catch(reason => {
        reject(reason);
      });
    }
  });
};

结语:备战面试,势在必得

以上仅是 Promise 手写题中常见的几道题型。掌握这些题目的解答思路和实现方式,可以极大地提升你在面试中的竞争力。当然,面试的考题千变万化,做好充分的准备才能应对自如。希望这篇文章能对各位求职者有所帮助,祝大家都能斩获心仪的 Offer!

常见问题解答

1. Promise 的状态有哪些?

Promise 有三种状态:pending(等待)、fulfilled(完成)和 rejected(拒绝)。

2. then 方法的作用是什么?

then 方法用于添加回调函数,处理 Promise 的结果。

3. catch 方法的作用是什么?

catch 方法用于处理 Promise 拒绝时的回调函数。

4. Promise.all 和 Promise.race 的区别?

Promise.all 用于处理多个 Promise 并行执行的情况,而 Promise.race 用于处理多个 Promise 竞争执行的情况。

5. 如何使用 Promise 处理异步操作?

可以将异步操作封装成 Promise,然后使用 then 或 catch 方法处理结果。