あなたが知らないjavascript-中巻

6305 ワード

Promise
Promiseは,将来の値を閉じて結合するための簡単なコピー機構である.
function foo(x) {
    //       
    //    listener           
    return listener;
}
var evt = foo(4);
evt.on("completion",function() {
    //        
});
evt.on("failure", function() {
    //    
});
// bar(..)  foo(..)   
bar(evt);
// baz(..)  foo(..)   
baz(evt);
イベント聞き手のevtはPromiseのシミュレーションです.Promiseベースの方法では、前のコードセグメントはfoo(.)を作成してPromiseのインスタンスに戻しますが、このPromiseはbar(.)とbaz(.)に伝えられます.
function foo(x) {
    //    
    //       promise
    return new Promise(function(resolve,reject) {
        //    resolve(..)  reject(..)
        ///    promise     
    });
}
var p = foo(4);
bar(p);
baz(p);
new Promise(function(.){.}の着信関数は、すぐに実行されます.(then(.)のコールバックのように非同期的に遅延しません).二つのパラメータrevoveとrejectがpromiseのための決議関数です.Promiseの作成過程やその決議結果を確認する過程で、いつでもJavascript異常エラーが発生したら、この異常は捕らえられ、このPromiseは拒絶されます.Promise.resove(.)は信頼できるPromiseの閉鎖ツールを提供しました.
//       
foo(42)
.then(function(v){
    console.log(v);
});
//     
Promise.resolve(foo(42))
.then(function(v){
    console.log(v);;
});
Promiseオブジェクトは、非同期動作の最終的な完了(または失敗)およびその結果値の表現に使用される.(簡単に言うと、非同期要求を処理することです.私たちはよく約束をします.もし私が勝ったら結婚してください.負けたら結婚します.などという約束です.これはpromiseの中国語の意味です.一つの約束は成功して一つの失敗です.)
Promiseは非常に良いです.それらは私たちが調整コードだけで困っている制御反転問題を解決しました.しかし、それらはフィードバックを捨てずに、私たちと他のツールとの信頼できる仲介機構にフィードバックの手配を渡しました.Promiseオブジェクトは、プロキシオブジェクト(プロキシ1つの値)であり、プロキシされた値はPromiseオブジェクトの作成時に未知である可能性があります.非同期動作の成功と失敗のためにそれぞれの処理方法を結びつけることができます.これは、非同期方法のように値を返すことができますが、最終的な実行結果をすぐに返すのではなく、将来の結果を表すプロミセオブジェクトです.
一つのPromiseには以下のような状態があります.
pending:初期状態は成功や失敗の状態ではありません.fulfilled:操作が成功したことを意味します.rejected:操作が失敗することを意味します.pending状態のPromiseオブジェクトは、fulfilled状態をトリガし、対応する状態処理方法に値を伝達することができ、失敗状態をトリガし、失敗情報を伝達することもできる.いずれかの場合にPromiseオブジェクトのthenメソッドバインディングの処理方法が起動されます.(then方法は2つのパラメータを含みます.Oful filledとオンレジェクトはいずれもFunctedタイプです.Promise状態がfulfilledの場合、thenのOful filledメソッドを呼び出します.Promise状態がrejectの場合、thenのオンレジェクトメソッドを呼び出すので、非同期操作の完了とバインディング処理方法の間に競合はありません.)
ジェネレータ
ジェネレータを1つの値の生産者と見なして、ローズマリーインターフェースのnext()を呼び出して一度に1つの値を取り出します.
function foo(x, y) {
    ajax("http://someurl.com?x=" + x +"&y=" + y,
    function(err,data) {
        if(err) {
            it.throw( err );
        }
        else {
            it.next(data);
        }
    }
    )
}
function *main() {
    try {
        var text = yield foo(11, 13);
        console.log(text);
    }
    catch (err) {
        console.log(err);
    }
}
var it = main();
//     
it.next();
ジェネレータ+Promise
function foo(x,y) {
    return request(
        "http://someurl.com?x=" + x +"&y=" + y,
    );
}
function *main() {
    try {
        var text = yield foo(11, 13);
        console.log(text);
    }
    catch (err) {
        console.log(err);
    }
}
var it = main();
var p = it.next().value;
//  promise p  
p.then(
    function(text) {
        it.next(text);
    },
    function(err) {
        it.throw(err);
    }
);
Promiseと生成器の最大の効果を得るための最も自然な方法は、yieldがpromiseを出し、このプロミスを通じて生成器のサブジェネレータを制御することである.