promise,手写piomise

// 假设有相应的 success、result、error 变量定义
const success: boolean = true;
const result: any = 'success result';
const error: any = 'error occurred';

new Promise<void>((resolve, reject) => {
  if (success) {
    resolve(result);
  } else {
    reject(error);
  }
}).then((result) => {
  // 处理成功回调
  console.log('Success:', result);
}).catch((err) => {
  // 处理失败回调
  console.error('Error:', err);
});

当手写一个 Promise 类时,需要实现 Promise 的三个状态(Pending、Fulfilled、Rejected)以及相关的方法(then、catch)。以下是一个简单的手写 Promise 的示例:

enum PromiseState {
  Pending = 'pending',
  Fulfilled = 'fulfilled',
  Rejected = 'rejected',
}

type Executor<T> = (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void;

class MyPromise<T> {
  private state: PromiseState = PromiseState.Pending;
  private value: T | undefined = undefined;
  private reason: any = undefined;
  private onFulfilledCallbacks: ((value: T) => void)[] = [];
  private onRejectedCallbacks: ((reason: any) => void)[] = [];

  constructor(executor: Executor<T>) {
    try {
      executor(this.resolve.bind(this), this.reject.bind(this));
    } catch (error) {
      this.reject(error);
    }
  }

  private resolve(value: T | PromiseLike<T>): void {
    if (this.state === PromiseState.Pending) {
      this.state = PromiseState.Fulfilled;
      this.value = value;
      this.onFulfilledCallbacks.forEach(callback => callback(value));
    }
  }

  private reject(reason: any): void {
    if (this.state === PromiseState.Pending) {
      this.state = PromiseState.Rejected;
      this.reason = reason;
      this.onRejectedCallbacks.forEach(callback => callback(reason));
    }
  }

  then<U>(onFulfilled: (value: T) => U, onRejected?: (reason: any) => U): MyPromise<U> {
    const newPromise = new MyPromise<U>((resolve, reject) => {
      if (this.state === PromiseState.Fulfilled) {
        try {
          const result = onFulfilled(this.value!);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      } else if (this.state === PromiseState.Rejected && onRejected) {
        try {
          const result = onRejected(this.reason);
          resolve(result);
        } catch (error) {
          reject(error);
        }
      } else {
        this.onFulfilledCallbacks.push(value => {
          try {
            const result = onFulfilled(value);
            resolve(result);
          } catch (error) {
            reject(error);
          }
        });
        if (onRejected) {
          this.onRejectedCallbacks.push(reason => {
            try {
              const result = onRejected(reason);
              resolve(result);
            } catch (error) {
              reject(error);
            }
          });
        }
      }
    });
    return newPromise;
  }

  catch<U>(onRejected: (reason: any) => U): MyPromise<U> {
    return this.then(undefined, onRejected);
  }
}

// 示例用法
const promise = new MyPromise<string>((resolve, reject) => {
  setTimeout(() => {
    resolve('Promise resolved');
    // reject('Promise rejected');
  }, 1000);
});

promise.then(result => {
  console.log('Resolved:', result);
  return 'New Promise result';
}).then(newResult => {
  console.log('Chained Then:', newResult);
}).catch(error => {
  console.error('Rejected:', error);
});

这段代码实现了一个简单的 Promise 类 MyPromise,包括构造函数、resolve、reject、then 和 catch 方法。在构造函数中,接受一个执行器函数 executor,并在其中调用 resolvereject 方法。在 then 方法中,根据 Promise 的状态调用相应的回调函数,并返回一个新的 Promise 对象。在 catch 方法中,简单地调用 then 方法并传入 undefined 作为成功回调函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天吃饭的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值