Promise大法が良い
4624 ワード
Promise概要
Promiseは、JavaScript(ECMAScript 6)/Java(8)/Node.js(0.12)は、オリジナルのサポートがありますが、ネイティブサポートがない言語は第三者の枠組みを通して簡単に導入できます。
なぜ非同期が良い解決策ではないですか?
1..allback Hell
Promiseの核心
ここではNode.js(v 0.12)を例にとって、一部の用語は異なるプログラミング言語で実装される場合があり、JavaScriptではPromiseは内蔵オブジェクトである。
友情のヒント:以下のものは詰め物だけで、スキップできます。の3つの状態: の呼び出し: が実行される。状態遷移: と同じです。制御ストリーム: を呼び出します。
Promiseの簡単な使い方
1.Easy Mode
Promiseを抱擁して、Callbackに別れを告げて、あなたは私が持つべきです。古いOO聖教、Java大法まで全部Lambadaと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は内蔵オブジェクトである。
友情のヒント:以下のものは詰め物だけで、スキップできます。
fullfied
:resolve
によって後の状態rejected
:reject
によって後の状態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 ModeasyncFunction().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 Modefunction 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;
}