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

推薦する

VMware仮想マシンブリッジによるインターネット相互接続を実現する方法

VMware をインストールして新しい仮想マシンを作成したら、オプション バーの [編集] - [仮...

Kubernetes YAMLファイルの使用

目次01 YAMLファイルの概要YAML---キー値型YAML---リスト型02 K8Sにおけるマス...

geoip を使用して nginx で地域を制限する方法

このブログは仕事のメモです環境: nginx バージョン: nginx/1.14.0 Centos ...

CSS でリスト スタイル属性を設定する方法 (この記事を読むだけ)

リストスタイルのプロパティHTMLには、順序なしリストと順序ありリストの2種類のリストがあります。仕...

Docker環境でJenkinsを設定すると、タスクをビルドするときにコンソールログに文字化けした中国語の文字が表示されます

目次1. 問題の説明: 2. Jenkins設定のトラブルシューティング3. コードログのエンコード...

Webpack5-react スキャフォールディングをゼロから構築するための実装手順 (ソースコード付き)

目次ウェブパック5公式スタート建築ガイド構築を開始する依存する準備が完了したら、プロジェクトの構築を...

Nginx でアクセス頻度、ダウンロード速度、同時接続数を制限する方法

1. アクセス頻度、同時接続、ダウンロード速度を制限するために使用されるモジュールと命令の概要ngx...

JS オブジェクトのコピー (ディープ コピーとシャロー コピー)

目次1. 浅いコピー1. Object.assign(ターゲット、ソース、ソース...) 2. スプ...

CSS3 rgb と rgba (透明色) の使い方の詳しい説明

誰もが色にとても敏感だと思います。私たちの目が見るところにはどこにでも色があります。では、CSS で...

Vue ディレクティブ v-html と v-text

目次1. v-text テキストレンダリング命令2. v-html 1. v-text テキストレン...

VirtualBox でのホストオンリー + NAT モードのネットワーク構成

VirtualBoxのHost Only+NATモードのネットワーク構成は参考用です。具体的な内容は...

Vue+express+Socketでチャット機能を実現

この記事では、チャット機能を実現するためのVue+express+Socketの具体的なコードを参考...

HTML 編集の基礎 (初心者必読)

DREAMWEAVER を開き、新しい HTML を作成します。 。ボディの特性: bgcolor...

jQueryはマウスドラッグ画像機能を実装します

この例では、jQuery を使用してマウス ドラッグ イメージ機能を実装します。まず、ラッパーを設定...

Docker を使用してスタンドアロン Pulsar とクラスター化された Redis をデプロイする方法 (開発アーティファクト)

目次1. はじめに: 2. ドッカー: 1 カスタムネットワーク2 展開を開始する3 ネットワークを...