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

推薦する

Tomcat ディレクトリ構造の詳細な紹介

tomcat の解凍されたディレクトリを開くと、次のディレクトリ構造が表示されます。 1.Tomca...

IP アドレス経由で MySql にアクセスする方法

1. mysqlにログインします。 mysql -u ルート -h 127.0.0.1 -p 2. ...

MySQL 5.7.10 インストール ドキュメント チュートリアル

1. 依存パッケージをインストールする yum -y インストール gcc-c++ ncurses-...

MySQL で not in を使用して null 値を含める問題を解決する

知らせ! ! ! uid が (a,b,c,null) に含まれないユーザーから * を選択します。...

VantフレームワークをWeChatアプレットに導入するプロセス全体の記録

序文WeChat ミニプログラムのネイティブ UI が少し物足りないと感じることがあるので、サードパ...

jsでライトスイッチの効果を実現

この記事の例では、ライトスイッチ効果を実現するためのjsの具体的なコードを参考までに共有しています。...

tomcatでcatalina.outログをカットする3つの方法の詳細な説明

1. ログセグメンテーションのためのLog4j 1) log4j-1.2.17.jar、tomcat...

CentOS7 デプロイメント Flask (Apache、mod_wsgi、Python36、venv)

1. Apacheをインストールする # yum インストール -y httpd httpd-de...

MySQL で複数の主キーが定義されているエラーの解決方法

主キーを作成するには 2 つの方法があります。 テーブルテーブル名を作成( フィールド名タイプ、 フ...

VMware での Ubuntu 16.04 イメージの完全インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04イメージのインストールチュートリアルを参...

Javascriptはセキュリティ検証に整合性属性を使用します

目次1. スクリプトタグを使用してファイルをインポートする1. ローカルファイルをインポートする2....

Docker で複数のアプリケーション サイトをプロキシするために Nginx を使用する方法

序文エージェントの役割は何ですか? - 複数のドメイン名が同じサーバーに解決される- 1つのサーバー...

CentOS8でyumソースを変更した後にウェアハウスキャッシュの同期に失敗する問題の詳細な説明

問題の原因: 最初は CentOS 8 のデフォルトの yum ソースを正常に使用できますが、次のコ...

Vue フィルター、ライフサイクル関数、vue-resource の簡単な紹介

1. フィルター例: <!DOCTYPE html> <html lang=&qu...

JavaScript 配列重複排除問題の詳細な研究

目次序文 👀リサーチを始めましょう🐱‍🏍オリジナル🧶 indexOf を使用した元の方法の最適化 ✍...