コールバック関数:
この関数は、渡された関数パラメータを起動しています。
例えば:
function a(callback){
callback();
}
a(function(){
})
コールバック地獄:
コールバック関数は、あまりにも多くを適用します。Ajaxと非同期データを取得することができるようにするために、非同期の膨大な数の内部JSONPフロント、将来的に非同期実行の成功後にデータを取得するために、多くのコールバックを使用します。
ある程度までは、コールバック地獄は、この問題を解決することができますが、欠点があります、またはエレガント、読み取りが非常に貧弱であると言います。
例えば:
var sayhello = function (order, callback) {
setTimeout(function () {
console.log(order);
callback();
}, 1000);
}
sayhello("first", function () {
sayhello("second", function () {
sayhello("third", function () {
console.log("end");
});
});
});
//输出: first second third end
プロミスの説明:
-
約束は、コールバック・ソリューションの一つ地獄で、我々は(ES6の規定は、プロミスオブジェクトはコンストラクタである、のために、約束のインスタンスを生成したコールバック地獄、コードの可読性と保守性の問題を解決するための文法の約束を使用しますすべての非同期)。
-
:約束は三つの状態がある
;:保留中の非同期のものが実行されている
非同期の事成功;:成就
拒否を非同期事ができませんでした。 -
基本的な構文を約束します:
let p = new Promise(function(resolve,reject){
// 此处做一个异步的事情
})
p.then(function(){})
p.catch(function(){})
resolve函数
パラメータとして渡すアウトの呼び出しに成功すると、非同期操作の役割、および非同期操作の結果、。reject函数
役割は、非同期操作は呼び出しを失敗した、と非同期操作がエラーを報告し、パラメータとして亡くなりました- 約束の例を生成した後、次のことが可能
then方法
に解決状態と、拒否された状態のコールバック関数を指定します。- 物事は後に、その後、次に入力し、2番目のコールバックを記述しない場合は、その後、2番目のコールバックを入力します拒否します
catch方法
。- 次いで、この方法は、引数として、2つのコールバック関数を受け入れることができます。状態プロミスオブジェクトは分解状態をプロミスが拒否対象になったときに、2番目のコールバック関数が呼び出されるとなったときに最初のコールバック関数が呼び出されます。第二の機能はオプションで提供する必要はないことを特徴とします。両方の関数は約束をパラメータとして来たオブジェクトの値を受け入れます。
- チェーンのコールの約束:
let p = new Promise(function(resolve,reject){
// 此处做一个异步的事情
}).then(function(){
return new Promise(function(){
// 此处做第二个异步的事情
}).then(function(){
})
- プロミスバッチ-all:
すべての成功、成功です。限り障害が発生しているとして、それが失敗です。
let p1 = new Promise(function(resolve,reject){});
let p2 = new Promise(function(resolve,reject){});
let p3 = new Promise(function(resolve,reject){});
Promise.all([p1,p2,p3]).then(function(){
}).catch(function(){
})
- プロミスバッチ-race:
関係なく、成功または失敗の、状態の第一の端を取得します。
let p1 = new Promise(function(resolve,reject){});
let p2 = new Promise(function(resolve,reject){});
let p3 = new Promise(function(resolve,reject){});
Promise.race([p1,p2,p3]).then(function(){
}).catch(function(){
})
コールバック地獄を解決するための約束:
var sayhello = function (order) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
console.log(order);
//在异步操作执行完后执行 resolve() 函数
resolve();
}, 1000);
});
}
sayhello("first").then(function () {
//仍然返回一个 Promise 对象
return sayhello("second");
}).then(function () {
return sayhello("third");
}).then(function () {
console.log('end');
}).catch(function (err) {
console.log(err);
})
//输出:first second third end