簡単な約束を段階的に実行する方法を教えます

簡単な約束を段階的に実行する方法を教えます

ステップ1: フレームワークを構築する

1. まず、ここに promise 関数本体を配置し、次に、resolve および deny 実行関数を追加する必要があります。

  関数 Promise(エグゼコター) {}

2. 元のPromiseにはthenとcatchという2つの主なメソッドがあるので、thenとcatchをPromiseのプロトタイプに追加する必要があります。

  Promise.prototype.then = 関数 (onResolved、onRejected) {}
  Promise.prototype.catch = 関数 (onRejected) {}

3. Promise に、resolve、reject、all、race などの一般的なメソッドをいくつか追加します。

解決: 指定された結果を持つPromiseオブジェクトを返します

  Promise.resolve = 関数 (値) { }

拒否: 失敗ステータスを返すメソッド

  Promise.reject = 関数 (値) { }

all: プロミス オブジェクトを返します。この状態は、すべてのプロミスが返された場合にのみ成功したと見なされます。

  Promise.all = 関数 (値) { }

race: 最初に返されたオブジェクトによって状態が決定される Promise オブジェクトを返します。レース内のどの関数が最初に実行されても、最初の値が直接返され、他の関数は引き続き実行されます。

  Promise.race = 関数 (値) { }

4. mypromiseの世界宣言

  window.Promise = プロミス

5. 上記のすべての内容をラップする自己実行関数を作成する

(関数 (ウィンドウ) {

})()

ステップ2 構築されたPromiseフレームワークに入力する

1. 関数Promise()を記入する

(1) let self = this は関数内の this を修正します。この this は後で大きな役割を果たします。

(2)self.status = 'pending'はPromise関数本体に基本ステータス'pending'を追加します。

(3)self.data = undefinedは、resolveによって返された結果を格納するためのデータソースを作成します。

(4) self.callbacks = [] はプロミス内のすべてのコールバックを保存するための配列を作成します。

2. 関数resolve()に記入する

(1) if (self.status !== 'pending') { return } 現在の受信プロセスのステータスが保留中かどうかを確認します。保留中の場合は、次の操作を続行します。保留中でない場合は、直接戻ります。

promise には、保留中、解決済み、拒否の 3 つの状態があります。これら 3 つの状態はスイッチ変数です。状態が保留中から他の状態に変わると、変更できません。

(2)self.status = 'resolved'はプロセスのステータスを解決済みに変更します。

(3)self.data = valueは、その後のコールバックで使用される値を保存します。

(4)最も重要な実行関数部分を配置します。sele.data内に実行すべきコールバック関数がある場合は、すぐに非同期で実行します。

    (自己コールバックの長さ>0)の場合{
      タイムアウトを設定する(() => {
        self.callbacks.forEach(callbackObj => {
          callbackObj.onResolved(値)
        })
      }, 0)
    }

3. 関数reject()を埋め込む

(1)resolve関数と同じ、ここでは省略

4. 実行メソッドを入力する

プロミス本体の実行中にエラーが発生した場合、エラー メッセージが catch 関数によってキャプチャされ、関数にジャンプして、reject ステートメントを個別に実行します。

     試す {
       実行者(解決、拒否)
     } キャッチ(エラー){
       拒否(エラー)
     }

5. .then関数に入力する

まず、着信プロセスの状態を区別する必要があります。保留中の場合は、コールバック関数を保存します。保留中でない場合は、実行すべきことを実行します。

(1)if (self.status === 'pending') 現在のステータスが保留中の場合、それを保存します

    自己.コールバック.プッシュ({
      onResolved() { onResolved(self.data) },
      onRejected() { onRejected(self.data) }
    })

(2) else if (self.status === 'resolved') ステータスが解決されている場合

楽しく実行してみましょう。

    タイムアウトを設定する(() => {
      自己データ解決時
    }, 0)

しかし、resolve が実行されていないのに状態が変わった状態があります。resolve は実行できず、代わりに declined を実行します。

   それ以外{
     タイムアウトを設定する(() => {
       拒否された場合(self.data)
     }, 0)
   }

象を冷蔵庫に入れるのと同じくらい「簡単」な2つのステップを経て、私たちはシンプルなPromiseを実装しました。

簡単ですよね?友達を呼んで一緒に試してみましょう!

要約する

シンプルなプロミスの実装に関するこの記事はこれで終わりです。シンプルなプロミスの実装の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript で Promise を使用する詳細な例
  • この記事を読むだけで、js promiseについての簡単な説明は十分です
  • Javascript Promise の使い方の詳細な説明
  • JavaScript における Promise の使用法の詳細な説明
  • JavaScript Promiseの使用法
  • JavaScript における Promise の使用を理解する

<<:  HTML タグ tbody の使い方と説明

>>:  ブートストラップ学習体験のまとめ - CSS スタイル デザイン共有

推薦する

ServerManager の起動時にデータベースに接続できないエラーを解決する方法

Servermanager 起動時の接続データベース エラーmgrstart.batを実行しますエラ...

Linux スクリプトの基礎を詳しく紹介

目次1. スクリプトvim環境2. シェルスクリプトで環境を定義する方法3. シェルスクリプト内の翻...

Nginx タイムアウト設定の詳細な説明

最近、プロジェクトで nginx を使用し、バックエンドで Java を使用しました。バックエンドで...

Vue 3 で Vue Router リンクを拡張する方法

序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...

MySQLサービスの自動停止の解決策

この記事では主に、MySQL サービスの自動停止の解決策を紹介し、参考と学習のために共有します。一緒...

Vue開発の詳細な説明 ソートコンポーネントコード

目次 <テンプレート> <ul class="コンテナ">...

VueプロジェクトにPWAを導入する手順

目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...

ページ内にマーキーとフラッシュが共存する場合の競合解決

競合の主な症状は、FLASH ボタンがジャンプし続け、不安定になり、Web ページの外観と通常のアク...

MySql はコミットする必要がありますか?

MySQL が挿入などの操作を実行するときにコミットする必要があるかどうかは、ストレージ エンジン...

MySQLはランダムに一定数のレコードを抽出します

以前は、このような使用シナリオを処理するために rand() で直接 order していましたが、効...

Raspberry Pi msmtp と mutt のインストールと設定のチュートリアル

1. muttをインストールするsudo apt-get install mutt 2. msmtp...

コンパイル、インストールから設定ファイルの説明まで、中国語でnginxの詳細な説明

この記事では、コンパイルとインストールから設定ファイルの説明まで、Nginx について詳しく紹介しま...

Vueはログイン時に画像認証コードを実装します

この記事では、Vueログイン用画像認証コードの具体的なコードを例として紹介します。具体的な内容は以下...

MySQL の分離レベルの包括的な分析

データベースが同じデータ バッチを同時に追加、削除、および変更すると、ダーティ書き込み、ダーティ読み...

MySQL5.7.21 解凍版インストール詳細チュートリアル図

私は頻繁にシステムをインストールするので、インストールのたびにいくつかのソフトウェアを再インストール...