Promise大法が良い

4624 ワード

Promise概要
Promiseは、JavaScript(ECMAScript 6)/Java(8)/Node.js(0.12)は、オリジナルのサポートがありますが、ネイティブサポートがない言語は第三者の枠組みを通して簡単に導入できます。
なぜ非同期が良い解決策ではないですか?
1..allback Hell
loadScript("a.js",function(){
    loadScript("b.js",function(){
        loadScript("c.js",function(){
            loadScript("d.js",function(){
                loadScript("e.js",function(){
                    console.log("Fuck to load async files")
                }
            })
        })
    })
})
2.依存習慣コード
function asyncFunc(callback){
    doSomething(function(err, result){
        if(err){
            callback(err, null);
        }
        callback(null, result);
    })
}

asyncFunc(function(err,result){
    if(err){
        console.error(err);
    }
    console.log(result);
})

anotherAsyncFunc(function(result,err){
    if(result){
        console.log("Fuck why the first is result");
    }
})
他にも様々な種類があります。例えば、コントロールフローが書きにくい(複数の異なる非同期タスクの条件判断と進捗制御)、try/catchが回転異常を捕まえられない……様々な原因でより良い解決策を選択するように迫られています。
Promiseの核心
ここではNode.js(v 0.12)を例にとって、一部の用語は異なるプログラミング言語で実装される場合があり、JavaScriptではPromiseは内蔵オブジェクトである。
友情のヒント:以下のものは詰め物だけで、スキップできます。
  • の3つの状態:fullfiedresolveによって後の状態rejectedrejectによって後の状態pending:初期状態
  • の呼び出し:then(onFulfilled, onRejected)resolveによってonFulfilled関数が実行され、rejectedによってonRejected関数が実行される。また、実際には、Promiseを呼び出すたびに、then Promiseオブジェクト catch(onRejected)のシンタックス飴が返され、then(undefined, onRejected)によって、rejectedによって、onRejected関数
  • が実行される。
  • 状態遷移:resolve(value):シンタックス糖は、すぐにfullfiedに返され、fullfied状態に遷移するPromiseオブジェクトを返します。これは、
    new Promise(function(resolve){
        resolve(value);
    });
    
  • と同じです。reject(value):構文糖は、すぐにresolveに返され、rejectedに変換されたPromiseオブジェクトを返します。
    ```javascript
    new Promise(function(resolve){
        resolve(value);
    });
    ```
    
  • 制御ストリーム:Promise.all([promise1, promise2, ...]) Promiseオブジェクトがresolveによって呼び出されたときにthen(onFulfilled(value))(valueは配列の値)を呼び出す。または、いずれかのPromiseオブジェクトがrejectによって呼び出されたとき、catch(onRejected) PromiseオブジェクトがPromise.race([promise1, promise2, ...])または によって呼び出されたとき、resolveまたは
  • を呼び出します。
    Promiseの簡単な使い方
    1.Easy Mode
    function asyncFunction() {
        if (1 === 1){
            return Promise.resolve("OK");
        }
        else{
            return Promise.reject(new Error("Wrong"));
        }
    }
    
    asyncFunction().then(function(val){
        console.log(val);
    }).catch(function(err){
        console.error(err);
    })
    
    OK
    
    2.Normal Mode
    asyncFunction().then(function(val){
        console.log(val);
        return "First";
    }).then(function(val){
        console.log(val);
        return "Second";
    }).then(function(val){
        throw new Error("Fuck");
        console.log(val);
    }).catch(function(err){
        console.error(err);
    })
    
    console.log("Start!");
    
    Start
    OK
    First
    [Error: Fuck]
    
    3.Hard Mode
    function anotherAsyncFunction(){
        if (2 != 2){
            return Promise.resolve("OK");
        }
        else{
            return Promise.reject(new Error("Wrong"));
        }
    }
    
    Promise.all([asyncFunction(),anotherAsyncFunction()]).then(function(val){
        console.log("All:" + val);
    }).catch(function(err){
        console.error("All:" + err);
    });
    
    Promise.race([asyncFunction(),anotherAsyncFunction()]).then(function(val){
        console.log("Race:" + val);
    }).catch(function(err){
        console.error("Race:" + err);
    });
    
    Race:OK
    All:Error: Wrong
    
    後の話
    Promiseを抱擁して、Callbackに別れを告げて、あなたは私が持つべきです。古いOO聖教、Java大法まで全部LambadaとPromiseを抱いていますが、まだ何を待っていますか?
    public F.Promise post(String formData){
       WSRequest request = client.url(url);
       F.Promise responsePromise = request
               .setContentType("application/x-www-form-urlencoded")
               .post(formData);
       F.Promise jsonNodePromise = responsePromise.map(value -> {
           return value.asJson();
       });
    
       responsePromise.onFailure(error -> {
           Logger.error(error);
       });
    
       return jsonNodePromise;
    }