シンプルな Promise/A+ 標準 Promise ライブラリを実装するにはどうすればよいですか?

砂を集めて塔を作り、毎日少しずつ進んでいます


⭐コラム紹介

フロントエンドへの参入の旅: Web 開発の素晴らしい世界を探索してください。このコラムを購読するには、上または右側のリンクをクリックすることを忘れないでください。ジオメトリは、フロントエンドの旅へあなたを連れて行きます。

フロントエンドエントリーの旅へようこそ!このコラムは、Web 開発に興味があり、フロントエンド分野に参入したばかりの方を対象に作成されています。まったくの初心者であっても、ある程度の基本知識がある開発者であっても、ここでは体系的でフレンドリーな学習プラットフォームを提供します。このコラムでは、フロントエンドの知識やよくある質問への回答を厳選してQ&A形式で毎日更新していきます。Q&A 形式を通じて、フロントエンド テクノロジーに関する読者の質問により直接的に回答し、皆さんが徐々に強固な基礎を確立できるようにしたいと考えています。HTML、CSS、JavaScript、またはさまざまな一般的なフレームワークやツールのいずれについても、シンプルかつわかりやすい方法で概念を説明し、学んだ内容を定着させるための実践的な例と演習を提供します。同時に、フロントエンド開発におけるさまざまなテクノロジーをより深く理解し、適用するのに役立ついくつかの実践的なヒントとベスト プラクティスも共有します。

ここに画像の説明を挿入します

それだけでなく、学んだ知識を実際の開発に適用できるように、実践的なプロジェクトのチュートリアルも定期的に開始します。実際のプロジェクトの実践を通じて、フロントエンド開発のワークフローと方法論をより深く理解し、問題を解決し、自主的に開発する能力を養うことができます。継続的な蓄積と実践によってのみ、真のフロントエンド開発技術を習得できると私たちは信じています。さあ、挑戦の準備をして、このフロントエンドエントリーの旅に勇敢に乗り出しましょう! あなたが転職、スキルアップ、または個人的な興味の実現を求めている場合でも、私たちは最高の学習リソースとサポートを提供することに専念しています。一緒に Web 開発の素晴らしい世界を探検しましょう! フロントエンドのエントリージャーニーに参加して、優れたフロントエンド開発者になりましょう! フロントエンドの旅に出発しましょう。下の写真をスキップして、今日の本文を始めましょう。

ここに画像の説明を挿入します


⭐ プロミス/A+ スタンダード プロミス

Promise/A+ 仕様に準拠する Promise ライブラリの実装は、Promise 仕様の詳細と要件を深く理解する必要がある複雑な作業です。以下は、Promise/A+ 仕様の主な要件に従った基本的な Promise 実装を示す簡略化された例です。

class MyPromise {
    
    
  constructor(executor) {
    
    
    // 初始状态为等待(pending)
    this.state = 'pending';
    this.value = undefined;
    this.onResolvedCallbacks = [];
    this.onRejectedCallbacks = [];

    const resolve = (value) => {
    
    
      if (this.state === 'pending') {
    
    
        this.state = 'fulfilled';
        this.value = value;
        this.onResolvedCallbacks.forEach((callback) => callback(value));
      }
    };

    const reject = (reason) => {
    
    
      if (this.state === 'pending') {
    
    
        this.state = 'rejected';
        this.value = reason;
        this.onRejectedCallbacks.forEach((callback) => callback(reason));
      }
    };

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

  then(onFulfilled, onRejected) {
    
    
    onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : (value) => value;
    onRejected = typeof onRejected === 'function' ? onRejected : (reason) => {
    
     throw reason; };

    if (this.state === 'fulfilled') {
    
    
      return new MyPromise((resolve, reject) => {
    
    
        setTimeout(() => {
    
    
          try {
    
    
            const result = onFulfilled(this.value);
            resolve(result);
          } catch (error) {
    
    
            reject(error);
          }
        }, 0);
      });
    }

    if (this.state === 'rejected') {
    
    
      return new MyPromise((resolve, reject) => {
    
    
        setTimeout(() => {
    
    
          try {
    
    
            const result = onRejected(this.value);
            resolve(result);
          } catch (error) {
    
    
            reject(error);
          }
        }, 0);
      });
    }

    if (this.state === 'pending') {
    
    
      return new MyPromise((resolve, reject) => {
    
    
        this.onResolvedCallbacks.push((value) => {
    
    
          setTimeout(() => {
    
    
            try {
    
    
              const result = onFulfilled(value);
              resolve(result);
            } catch (error) {
    
    
              reject(error);
            }
          }, 0);
        });

        this.onRejectedCallbacks.push((reason) => {
    
    
          setTimeout(() => {
    
    
            try {
    
    
              const result = onRejected(reason);
              resolve(result);
            } catch (error) {
    
    
              reject(error);
            }
          }, 0);
        });
      });
    }
  }

  catch(onRejected) {
    
    
    return this.then(null, onRejected);
  }

  static resolve(value) {
    
    
    return new MyPromise((resolve) => resolve(value));
  }

  static reject(reason) {
    
    
    return new MyPromise((_, reject) => reject(reason));
  }

  static all(promises) {
    
    
    return new MyPromise((resolve, reject) => {
    
    
      const results = [];
      let completedCount = 0;

      const checkCompletion = () => {
    
    
        if (completedCount === promises.length) {
    
    
          resolve(results);
        }
      };

      promises.forEach((promise, index) => {
    
    
        promise.then(
          (value) => {
    
    
            results[index] = value;
            completedCount++;
            checkCompletion();
          },
          (reason) => {
    
    
            reject(reason);
          }
        );
      });
    });
  }

  static race(promises) {
    
    
    return new MyPromise((resolve, reject) => {
    
    
      promises.forEach((promise) => {
    
    
        promise.then(
          (value) => {
    
    
            resolve(value);
          },
          (reason) => {
    
    
            reject(reason);
          }
        );
      });
    });
  }
}

thenこの簡素化された Promise 実装には、コンストラクター、 、catchメソッド、静的メソッドresolverejectallおよび を含む Promise の基本構造が含まれていますraceただし、これは非常に基本的な例にすぎないことに注意してください。実際の Promise ライブラリはより複雑で完全であり、より多くのエッジ ケースや非同期操作を処理する必要があります。

Promise実際のプロジェクトでは、ES6 に組み込まれているライブラリやサードパーティ ライブラリ (たとえばaxiosBluebirdなど) などの既製の Promise ライブラリを使用することをお勧めします。これらは広範にテストおよび最適化されており、実際のニーズをよりよく満たすことができます。


⭐最後に書いてください

フロントエンド初心者、フロントエンドを学んだことがないけどフロントエンドに興味がある人、もっと自分をアピールして展開したいバックエンド学生など、幅広い読者に向けたコラムです。面接プロセス中にいくつかのフロントエンドの知識ポイントがあるため、フロントエンドの基礎を身につけてこのコラムに従えば、ギャップを見つけて埋めるのにも大いに役立ちます。出力, 記事に不備がある場合は、ホームページの左側からご連絡ください。一緒に進歩していきましょう。同時に、いくつかのコラムも皆さんにお勧めします。興味のあるパートナーは購読できます: さらに以下のコラムにアクセスしてください。また、私のホームページにアクセスして他のコラムをご覧いただくこともできます。

フロントエンド ゲーム (無料)このコラムでは、HTML、CSS、JavaScript の基礎知識を活用して、創造性と楽しさに満ちた世界へあなたを誘い、さまざまな興味深いページ ゲームを一緒に構築していきます。初心者でも、フロントエンド開発の経験がある人でも、このコラムはあなたのためのものです。基本から始めて、ページ ゲームを構築するために必要なスキルについて説明します。実践的なケースと演習を通じて、HTML を使用してページ構造を構築する方法、CSS を使用してゲーム インターフェイスを美しくする方法、および JavaScript を使用してゲームにインタラクティブで動的な効果を追加する方法を学びます。このコラムでは、迷路ゲーム、レンガ崩し、スネーク、マインスイーパー、電卓、飛行機戦闘、三目並べ、パズル、迷路など、さまざまなタイプのミニゲームを取り上げます。各プロジェクトでは、詳細な説明とコード例を使用して、簡潔かつ明確な手順で構築プロセスをガイドします。同時に、ページのパフォーマンスとユーザー エクスペリエンスの向上に役立つ最適化のヒントとベスト プラクティスも共有します。フロントエンド スキルを発揮するための興味深いプロジェクトを探している場合でも、ページ ゲーム開発に興味がある場合でも、フロントエンド ゲームのコラムが最良の選択となるでしょう。クリックしてフロントエンド ゲームのコラムを購読します

ここに画像の説明を挿入します

Vue3 透明チュートリアル【ゼロからイチまで】(有料) Vue3 透明チュートリアルへようこそ!このコラムは、Vue3 に関する総合的な技術知識を皆様に提供することを目的としています。Vue2 の経験がある場合、このコラムは Vue3 の中心的な概念と使用法を習得するのに役立ちます。ゼロから始めて、完全な Vue アプリケーションを構築する方法を段階的にガイドします。実践的なケースと演習を通じて、Vue3 のテンプレート構文、コンポーネント開発、状態管理、ルーティング、その他の機能の使用方法を学びます。また、Vue3 の新機能をよりよく理解して適用できるように、Composition API や Teleport などのいくつかの高度な機能も紹介します。このコラムでは、詳細な説明とサンプルコードを使用して、各プロジェクトを簡潔かつ明確な手順でガイドします。同時に、困難を克服し、開発効率を向上させるために、Vue3 開発におけるいくつかの一般的な問題と解決策も共有します。Vue3 を詳しく学びたい場合でも、フロントエンド プロジェクトを構築するための包括的なガイドが必要な場合でも、Vue3 の徹底したチュートリアルのコラムは、あなたにとって不可欠なリソースとなるでしょう。クリックして Vue3 透過チュートリアル [ゼロから 1 まで] コラムを購読します

ここに画像の説明を挿入します

TypeScript 入門ガイド (無料) は、 TypeScript 関連テクノロジをすぐに始めてマスターできるように設計されたコラムです。簡潔で明確な言語と豊富なサンプルコードを通じて、TypeScript の基本概念、構文、機能を詳しく説明します。初心者でも経験豊富な開発者でも、ここで自分に合った学習パスを見つけることができます。型アノテーション、インターフェイス、クラスなどのコア機能から、モジュール開発、ツール構成、一般的なフロントエンド フレームワークとの統合まで、あらゆる側面を包括的にカバーします。このコラムを読むことで、JavaScript コードの信頼性と保守性が向上し、プロジェクトのコード品質と開発効率が向上します。この刺激的で挑戦的な TypeScript の旅に一緒に乗り出しましょう! クリックして TypeScript 入門ガイドのコラムを購読します

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/JHXL_/article/details/132894959