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コマンドの概要

推薦する

MySQLが中国語の文字を挿入する問題を永久に解決するコツを教えます

目次序文最初のステップ:ステップ2: このmy.iniを変更する要約する序文問題の説明:不正な文字列...

数千万件のレコードをMySQLに素早く挿入する方法に関する実践的なチュートリアル

1. データベースを作成する 2. テーブルを作成する1. deptテーブルを作成する テーブル「d...

WindowsにOpenSSLをインストールし、OpenSSLを使用して公開鍵と秘密鍵を生成します。

1. OpenSSL公式サイト公式ダウンロードアドレス: https://www.openssl....

フォームで完全な選択または逆選択効果を実現する JavaScript

この記事では、フォームの完全選択または逆選択を実現するためのJavaScriptの具体的なコードを参...

Linux での MySQL 8.0.11 のインストールに関するチュートリアル

1. 公式サイトにアクセスしてインストールパッケージをダウンロードしますダウンロードリンク: クリッ...

フロートをクリアするための CSS メソッドの概要

フロートはWebページのレイアウトでよく使用されますが、フローティングブロックレベル要素は標準のドキ...

フロントエンドページのスライド検証を実装するための JavaScript + HTML

この記事では、フロントエンドページのスライド検証を実装するためのJavaScript + HTMLの...

WeChatアプレットはシンプルな手書き署名コンポーネントを実装します

目次背景:必要:効果1. アイデア2. 実装1. ページとスタイル2. 初期化3. クリックすると4...

Linux での Makefile の書き方と使い方の詳細な説明

目次メイクファイルMakefile の命名とルールMakefile の仕組みMakefile変数Ma...

nginx アンチホットリンクおよびアンチクローラー設定の詳細な説明

新しい設定ファイルを作成します (たとえば、nginx インストール ディレクトリの下の conf ...

スライディングカルーセル効果を実現する js

この記事では、スライディングカルーセル効果を実現するためのjsの具体的なコードを参考までに共有します...

フォームアクションとonSubmitの例

まず、action はフォームの属性です。HTML5 では必須の属性値として定義されています。onS...

MySQL 8.0.19 インストール詳細チュートリアル (Windows 64 ビット)

目次MySQLを初期化するMySQL サービスをインストール + MySQL サービスを開始MySQ...

Dockerを使用してRedisクラスターを構築する方法

目次1. Redis Dockerベースイメージを作成する2. Redisノードイメージを作成する3...

VueでTypeScriptを使用する方法

導入近年、TypeScript を求める声がますます高まり、TypeScript はフロントエンドに...