Promiseの紹介と基本的な使い方の簡単な分析

Promiseの紹介と基本的な使い方の簡単な分析

Promise は、ES6 で導入された非同期プログラミングのための新しいソリューションです。 Promiseの構文は、コンストラクタ、
非同期操作をカプセル化し、その成功または失敗の結果を取得するために使用されます。

  • Promise コンストラクター: Promise (executor) {}
  • Promise.prototype.then メソッド
  • Promise.prototype.catch メソッド

Promiseの基本的な使い方

Promise のインスタンス化

新しいPromise()

インスタンス化時に 1 つのパラメータ (関数) を受け入れます。

この関数には、resolve と deny という 2 つのパラメーターがあります。

var promise = new Promise((resolve,reject) => {
    // 非同期操作を処理するために使用されます})

ここでは非同期操作をシミュレートするためにタイマーを使用します

Promise には、進行中、成功、失敗の 3 つの状態があります。

var promise = new Promise((resolve,reject) => {
    // これは非同期操作です setTimeout(() => {
        // ここでデータの取得をシミュレートします var data = '取得したデータ'
        // データを取得したら、resolve メソッドと reject メソッドを呼び出して、promise オブジェクトの状態を変更できます。resolve(data) // resolve は promise オブジェクトの状態を success に変更でき、reject() は promise オブジェクトの状態を failure に変更できます。 }, 1000);
})

Promiseのthenメソッド

プロミスオブジェクトのステータスが成功または失敗の場合、thenメソッドを呼び出すことができます。

thenメソッドは2つのパラメータを受け入れ、両方のパラメータは関数型の値である。

プロミスオブジェクトが成功状態にある場合、thenメソッドの最初のパラメータが呼び出されます。

つまり、promiseオブジェクトの状態が失敗した場合、thenメソッドの2番目のパラメータが呼び出されます。

2 番目のパラメータはオプションであり、失敗をキャプチャする必要がない場合は省略できます。

パラメータには仮パラメータがあり、成功した関数は value と呼ばれ、失敗した関数は err と呼ばれます。

promise.then(値 => {
// 非同期関数でresolve(data)が呼び出されると、つまりpromiseオブジェクトの状態が成功の場合、thenメソッドの最初のパラメータが呼び出されます。 console.log(value); // 'hello world' valueはresolve()メソッドによって渡されたデータです}, err => {
   // 非同期関数でreject(data)が呼び出されると、つまりpromiseオブジェクトの状態が失敗した場合、thenメソッドの2番目のパラメータが呼び出されます。 console.log(err); // errはreject()メソッドによって渡されたデータです})

then メソッドを呼び出した結果の戻り値は Promise オブジェクトであり、オブジェクトの状態はコールバック関数の実行結果によって決定されます。

コールバック関数で返される結果が非Promise型のプロパティの場合、ステータスは成功となり、戻り値はオブジェクトの成功値となる。

データ = promise.then((val) => {
    // console.log(val.result);
    // 非 Promise を返す // val.result を返す
 
    // Promise を返す return new Promise( (resolve, reject) => {
        // 解決('ok')
        拒否('エラー')
    })
}, エラー => {
コンソールログ(エラー);
})
// 非 Promise を返し、ステータスは成功です。戻り値はオブジェクトの成功値です。// 返される結果は Promise オブジェクトです。オブジェクトのステータスは、コールバック関数の実行結果によって決まります。// エラーをスローし、ステータスは失敗です。console.log(data);

したがって、 then はチェーンで呼び出すことができます。使用方法については、以下の promise アプリケーションの例を参照してください。

Promise catch メソッド

promiseのcatchメソッドはthen(null, rejection)の別名であり、エラーが発生したときにコールバックを指定するために使用されます。

Promiseオブジェクトの状態が解決されると、thenメソッドの指定されたコールバック関数が呼び出されます。

const promise = new Promise((resolve, deny) => {
    解決('OK')
})
promise.then(val => {
    console.log(val); // 正常
}).catch(エラー => {
    コンソールログ(エラー);
})

promise のステータスが拒否された場合、この問題を処理するために catch メソッドのコールバック関数が呼び出されます。

const promise = new Promise((resolve, deny) => {
    拒否('エラー')
})
promise.then(val => {
    コンソールログ(val);
}).catch(エラー => {
    console.log(err); // エラー
})

thenメソッドの実行中にエラーが発生した場合は、catchメソッドによっても捕捉されます。

const promise = new Promise((resolve, deny) => {
    解決('エラー')
})
promise.then(val => {
    console.log('ok'); // 正常
    「問題が発生しました!」と表示します。 ! ' // そのときスローされたエラーは引き続き catch によってキャッチされます}).catch(err => {
    console.log(err); // 問題が発生しました。 !
})

プロミス オブジェクトのエラーはバブリングの性質を持ち、キャッチされるまで返されます。つまり、エラーは常に次の catch によってキャッチされます。

const promise = new Promise((resolve, deny) => {
    解決('OK')
})
promise.then(val => {
    新しい Promise を返します ((resolve, reject) => {
        拒否('エラー')
    })
})
.then(val => {
    新しい Promise を返します ((resolve, reject) => {
        拒否('エラー')
    })
})
.catch(エラー => {
    // 上記で生成されたすべてのエラーは、catch console.log(err); でキャッチできます。// err
})

一般的に、then メソッドでは拒否ステータスのコールバック関数 (つまり、then の 2 番目のパラメーター) を定義せず、常に catch メソッドを使用します。

プロミスアプリ

ファイルの読み取りを約束し、複数のファイルが連続して呼び出されます

この例ではNode.jsファイルモジュールを使用します

// ファイル情報を読み取る const fs = require('fs')

次のコードでは、promiseを使用して非同期関数をラップします。

まず、通常のファイル読み取り操作を見てみましょう

// ファイル情報を読み取る const fs = require('fs')
 
// 読み取りに失敗した場合、err はエラーオブジェクト、読み取りが成功した場合、data はデータです fs.readFile('./01.txt', (err, data) => {
    // エラーが発生したかどうかを判断します。エラーが発生した場合は、エラー オブジェクトを出力します。
    もし(エラー){
        コンソールログ(エラー);
        戻る
    }
    コンソールにログ出力します。
})

読み取りが成功した後もファイルの読み取りを続けたい場合は、コールバック関数で fs.readFile... を引き続き使用してファイルを読み取ります。ネスト レベルが高すぎると、コールバック ヘルが形成されます。

次にPromiseメソッドを使ってファイルを読み込みます

// ファイル情報を読み取る const fs = require('fs')
 
const promise = new Promise((resolve, deny) => {
    fs.readFile('./01.txt', (err, データ) => {
        (err) の場合は、reject(err) を返します。
        解決(データ)
    })
})
 
promise.then(val => {
    コンソールにログ出力します。
    // Promiseオブジェクトを返す return new Promise((resolve, reject) => {
        fs.readFile('./02.txt', (err, データ) => {
            (err) の場合は、reject(err) を返します。
            解決(データ)
        })
    })
}, エラー => {
    コンソールログ(エラー);
})
// 前のthenはpromiseオブジェクトを返すので、continue.thenを実行できる
.then(val => {
    コンソールにログ出力します。
    新しい Promise を返します ((resolve, reject) => {
        fs.readFile('./03.txt', (err, データ) => {
            (err) の場合は、reject(err) を返します。
            解決(データ)
        })
    })
}, エラー => {
    コンソールログ(エラー);
})
.then(val => {
    コンソールにログ出力します。
}, エラー => {
    コンソールログ(エラー);
})

promiseはajaxリクエストをカプセル化する

Ajaxリクエストをカプセル化し、それを使用して結果を取得すると、コードがより簡潔になり、コールバック地獄の問題が解決されます。

const promise = new Promise((resolve, deny) => {
    // オブジェクトを作成する const xhr = new XMLHttpRequest()
    // 初期化 xhr.open("GET", 'https://api.apiopen.top/getSongPoetry?page=1&count=20')
    // 送信 xhr.send()
    // イベント処理応答結果をバインドする xhr.onreadystatechange = function () {
        // 判定 // 最後の段階に入り、すべてのレスポンス本文が返されます if (xhr.readyState === 4) {
            // 応答コードを決定する if (xhr.status >= 200 && xhr.status < 300) {
                // 成功を示します // console.log(JSON.parse(xhr.response));
                解決(JSON.parse(xhr.response))
            } それ以外 {
                拒否(xhr.ステータス)
            }
        }
    }
})
// コールバックを指定する promise.then((val) => {
    コンソールログ(val);
}, エラー => {
    コンソールログ(エラー);
})

Promise の紹介と基本的な使い方については以上です。Promise の使い方に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScriptはPromiseを使用して複数の繰り返しリクエストを処理します
  • JavaScript 非同期プログラミングにおける Promise の初期の使用法の詳細な説明
  • Promiseの使い方をステップバイステップで教えます
  • jsはPromiseを使用してシンプルなAjaxキャッシュを実装します
  • WeChatアプレットはPromiseを使用してコールバックを簡素化します
  • JS で Promise を使用して信号機のサンプル コードを実装する (デモ)

<<:  ラジオボタンとチェックボックス効果の純粋な CSS 実装例

>>:  一般的なDockerコマンドの概要

推薦する

Centos7 システムでの .NET Core 2.0 + Nginx + Supervisor 環境の構築

1. Linux .NET Core の紹介Microsoft は常に自社のプラットフォームに対して...

docker ログが取得できない問題の解決方法

毎日サービスをチェックしているときに、portainer からコンテナ ログを確認しようとしたところ...

VMware vSphere 6.5 インストール チュートリアル (画像とテキスト)

vmware vSphere 6.5 は vSphere ソフトウェアのクラシック バージョンであ...

Vue.jsはシンプルなタイマー機能を実装します

この記事では、参考までに、簡単なタイマー機能を実装するためのvue.jsの具体的なコードを紹介します...

フレックスレイアウトは、上下固定、中間スライドのレイアウトモードを実現します。

この記事では、主に、上下固定と中スライドレイアウトを実現するためのフレックスレイアウトのレイアウト方...

Vue の vue.$set() メソッドのソースコード例の詳細な説明

Vue を使用してプロジェクトを開発する過程で、次のような問題によく遭遇します。Vue のデータでオ...

vue+rem カスタムカルーセル効果

vue+remを使用したカスタムカルーセルチャートの実装は参考までに。具体的な内容は以下のとおりです...

MySQL接続がハングする理由の詳細な説明

目次1. 背景建築問題現象2. 分析プロセス接続プール不安に陥る雲を晴らして光を見よう3. 解決策I...

ホストNginx + Docker WordPress Mysqlを設定するための詳細な手順

環境Linux 3.10.0-693.el7.x86_64 Docker バージョン 18.09.0...

CSS で overflow-y: visible; が機能しない理由の分析と解決

シナリオ最近の要件は、モバイル デバイス用の h5 ページです。これには、選択可能なカードの行が必要...

シンプルな画像ドラッグ効果を実現する js

この記事では、簡単な画像ドラッグ効果を実現するためのjsの具体的なコードを参考までに紹介します。具体...

CocosCreatorでクールなレーダーチャートを描く方法

目次序文プレビュー文章グラフィックコンポーネントプロパティ機能グリッドを描く軸角度を計算するスケール...

Vue の高度な構築プロパティの詳細な説明

目次1. ディレクティブカスタムディレクティブ2. ミックスイン3. 継承を拡張する4. 提供して注...

CSS3 の transition、transform、translate の違いと機能の簡単な分析

変換して翻訳するTransform は、変換と変形を意味します。他の幅属性や高さ属性と同様に、CSS...