序文
プロミスは、コールバック・エリア、同期プログラミングExpressへの操作非同期動作に起因する問題を解決するため、深くネストされたコールバック関数を回避します。
約束とは何ですか
いわゆる約束は、単に将来的にイベントを保持するコンテナは、結果(、私たちの非同期操作です)最後になることを意味します。上記の文法のために、プロミスはオブジェクトであり、メッセージは非同期動作から得ることができます。統一されたAPIを提供することを約束は、非同期操作の様々な同じように扱うことができます。
約束のプロパティ
- 保留中、成就、拒否:約束のオブジェクトは、次の3つの状態があり、非同期操作を表し、
- その他の状態は、その状態を変更することができます。また、これは約束の名前の由来です。「コミットメント」は、他の手段は、その状態を変更することはできませんを意味します。
約束はすべての問題を解決するために見えます
いつものいわゆる「エリア外バック」のネストされたコードの約束の前にそこに表示されます、非同期プログラミングを実際のプログラムである約束
step(1, function() {
step(2, function() {
step(3, function() {
……….
})
})
})
私たちは、この「コールバック地獄」は、コードのフォーマットを書いて非常に怒っている人であることを知って、人々は、ネストされた層の後の人生をお読み疑うようになります。しかし、本当にこの「コールバック地獄」だけの問題形式が正しくありませんか?明らかではありません。
参照の例
「YDKJS」から例:プログラマは、長い時間のために良い実行された決済システムを開発しました。ある日突然、支払いクレジットカード時の顧客が継続的なブラシ5倍でした。プログラマの調査は、後に何らかの理由でサードパーティ製のツールライブラリは支払いコールバックが5回行われていることが分かりました。サードパーティのチームの問題との通信後に解決されました。
たとえば上記の方法は、信頼コールバック関数の問題が遅すぎるなどの信頼などを繰り返し呼び出しなどの問題、コールの多くにつながるです。それでは、どのようにこの2つの問題を解決することを約束?
プロミス意義
- 読みやすさ
第一の方法は、のように書き換えることができるので、我々は明らかに、上記のコードのように、日々の開発に見ることができ、その後、コールバックメソッドを書くことで私たちを支援し、約束です
Promise.resolve(1).
.then(step => ++setp)
.then(step => ++setp)
.then(step => ++setp)
...
- 厳格約束コミットメントの
それと道との差通常のコールバック
一般的な方法は、これらの操作を呼び出すために、コールバック関数内に直接書かれたコールバック後の動作の成功は、第三者によって制御されています
約束ウェイコールバックが成功した後、通知のための唯一の責任がある、とコールバックコールバック関数後の動作の成功は、その後、内部の約束の正確な制御を置きます。
なお、プロミス状態が不可逆的です。変更後はどのような状態に変更する方法はありません。約束が唯一の非同期、同期、非同期呼び出しは発生しません。
プロミスの欠点
- 新しい約束は、それが直ちに実行されますと、キャンセルはできません中にキャンセルすることはできません
- あなたはコールバック関数を設定しない場合、内部の約束スローされたエラーは、外部には反応しません。
- ステージする場所を知るのペンディング状態、現在決して(先頭または末尾)場合
約束の使い方
プロミスオブジェクトは、インスタンスの約束を生成するコンストラクタです
コンストラクタ関数をパラメータとして受け取り、2つのパラメータは、関数解決であり、拒否約束していない、これらの2つのパラメータではJavaScriptが提供する機能であり、自分自身を追加する必要
約束の例を生成した後、あなたはコールバック関数は、状態によって状態を解消してからメソッドを拒否指定することができます。しかし、その後、一般的に2つのパラメータを追加することはお勧めしません.then .catchを使用して、解決状態を終え推奨拒否終了。このように:
const promise = new Promise( (resolve,reject) => {
resolve('ok');
reject('error')
})
promise.then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
Ajaxの操作も約束して実施することができます。
const getJSON = function(url){
const promise = new Promise((resolve,reject) => {
const handler = function(){
if(this.readyState !== 4){//这两个if语句主要用来判断请求是否成功
return;
};
if(this.status === 200){
resolve(this.response)//这是成功请求后,将返回的数据传到回调函数中
}else{
reject(new Error(this.statusText))//这是失败后,将原因返给catch
}
};
const xmlHttp = new XMLHttpRequest();//声明一个XMLHttpRequest对象的实例
xmlHttp.open("get", url);//设置要发送的方法和地址
xmlHttp.onreadystatechange = handler;//在这里调用上面定义的handler
xmlHttp.responseType = "json";
xmlHttp.setRequestHeader("Accept", "application/json");//设置请求头,规定接受json类型的数据
xmlHttp.send();//真正的发送请求
});
return promise;
};
getJSON("url").then( res => {
//成功后的操作
}).catch(err => {
//失败后的提示
})
約束は、実施例約束パラメータの方法の他の例として約束を解決することで、ネストすることができます。
次いで、プロミスは、この方法は、新しい約束のインスタンスを返すプロトタイプで定義されている方法、の話、チェーンを使用して記述することができ、次いで、後者の方法、すなわち、別のメソッドを呼び出します。
いくつかの共通APIを約束それを今私をしましょう!
Promise.prototype.finally():
約束のオブジェクトの最終ステータスが実行されますどのような操作のための最後の方法
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
Promise.resolve():
- この方法は、ターゲットの約束にパラメータを変換するために使用されます
- プロミスパラメータは一例です:いいえ変更
- パラメータはthenableオブジェクト:このオブジェクトは、プロミスオブジェクトを変換した後、直ちに方法thenableオブジェクトを実行します。
- そして、引数がオブジェクトは、メソッドを持っていない、あるいは単にオブジェクトではありません:新しい約束のオブジェクトの状態が解消される戻り値を
- 約束ersolvedオブジェクトは、直接ステータスを返します。noパラメータを
Promise.reject() Promise.reject(理由)メソッドは、インスタンスの状態が拒否され、新たな約束のインスタンスを返します
Promise.all():
const p = Promise.all([p1, p2, p3]);
新しいインスタンス約束にパッケージ複数のインスタンスのための約束、。ない場合、このメソッドは、パラメータとして配列を受け取り、プロミスの一例であり、本方法は、それが最初Promise.resolveを呼び出します。注:アレイのインスタンスは状態が満たされる場合にのみ満たさPになるように、戻り値のアレイからなる。このとき、P1、P2、P3で、Pはコールバック関数に渡されます。長いP1、P2のうち、P3が拒否され、状態が拒否の拒否pが、この時の戻り値は、コールバック関数pに渡され、最初のインスタンスでなります。
Promise.race()及び全ての方法等、パッケージ化プロミスの複数のインスタンスに話しています。しかし、同じではないが、限り、P1のうちの1つのインスタンスがあるとして、P2、P3のリードは変化の状態、状態pを変更します。約束は変更に最初のインスタンスの値を返すために、それがコールバック関数pに渡されます。
実際の開発では、我々は常に非同期、同期的に実行同期機能を作りたい非同期関数を実行していますが、約束が処理を行うための同期機能を使用したい場合は、それを同期させることができますか?答えはイエスです。これはに来るPromise.try()の方法
const f = () => console.log('now');
Promise.try(f);
console.log('next');
// now// next