Promiseプログラミングモードは、遅延後に実行として理解できることを約束するプログラミングモードとも呼ばれます。それぞれの約束には、Thinと呼ばれる一意のインターフェイスがあり、約束が失敗または成功すると、コールバックが行われます。これは、長い間実行される可能性があり、必ずしも完了する必要はない操作結果を表しています。このパターンは、長期的な操作が完了するのをブロックして待ちませんが、約束された結果を表すオブジェクトを返します。
現在の現在のJavaScriptライブラリ(JQueryやDojo、Angularjsなど)は、Promiseと呼ばれるこの抽象化を追加しています。これらのライブラリを通じて、開発者は実際のプログラミングで約束モードを使用できます。
以下に、jQueryを例として使用して、JavaScriptライブラリがプロミスモードを使用して非同期処理を処理する方法について説明します。操作が成功または失敗する場合、またはいずれにせよ、対応するコールバックが実行され、特定のロジックの可能な状況を処理しようとします。
まず、jQueryが一般的にどのように動作するかを見てみましょう。
コードコピーは次のとおりです。
var $ info = $( "#info");
$ .ajax({
url: "/echo/json/"、
データ:{json:json.stringify({"name": "somevalue"})}、
タイプ:「投稿」、
成功:関数(応答)
{
$ info.text(respons.name);
}
});
この例では、設定が成功した場合、コールバックが指定されていることがわかります。これは良いコールバック方法です。これは約束ではなく、公式のjQueryドキュメントはこの方法を推奨しなくなりました(http://api.jquery.com/jquery.ajax/#jqxhr)。 AJAXコールが完了すると、成功関数が実行されます。ライブラリが使用する非同期操作に応じて、さまざまな異なるコールバックを使用できます(つまり、タスクが成功したかどうかにかかわらず、呼び戻されて応答します)。 Promiseモードを使用するとこのプロセスが簡素化されると、非同期操作はオブジェクトコールを返すだけです。この約束を使用すると、Thenに呼び出されたメソッドを呼び出してから、コールバックの関数の数を指定できます。
JQueryがどのように約束を築いているかを見てみましょう。
コードコピーは次のとおりです。
var $ info = $( "#info");
$ .ajax({
url: "/echo/json/"、
データ: {
json:json.stringify({
「名前」:「somevalue」
})
}、
タイプ:「投稿」
})
.then(function(response){
$ info.text(respons.name);
});
jQuery ajaxオブジェクトは、XHRオブジェクトを返すことによりPromiseモードを実装しているため、Then Methodを呼び出すことができます。これを行うことの利点は、以下に示すように、コールをチェーンして独立した操作を実装できることです。
コードコピーは次のとおりです。
var $ info = $( "#info");
$ .ajax({
url: "/echo/json/"、
データ: {
json:json.stringify({
「名前」:「somevalue」
})
}、
タイプ:「投稿」
})
.then(function(response){
$ info.text(respons.name);
})
.then(function(){
$ info.append( "... more");
})
.done(function(){
$ info.append( "... fally!");
});
多くのライブラリがPromiseモードの使用を開始するため、非同期操作は非常に簡単になります。しかし、反対の観点から考えると、約束はどのように見えるでしょうか?非常に重要なパターンの1つは、関数が2つの関数を受け入れることができることです。1つは成功したときにコールバックであり、もう1つは失敗時のコールバックです。
コードコピーは次のとおりです。
var $ info = $( "#info");
$ .ajax({
// URLを変更してエラーが発生します
url: "/echo/json/"、
データ: {
json:json.stringify({
「名前」:「somevalue」
})
}、
タイプ:「投稿」
})
.then(function(response){
// 成功
$ info.text(respons.name);
}、
関数 () {
// 失敗
$ info.text( "悪いことが良い開発者に起こる");
})
.always(function(){
$ info.append( "... fally");
});
JQueryでは、成功したか失敗したかにかかわらず、呼び出しを使用して呼び出したいものを指定することに注意する必要があります。
実際、これをここに書くこともできます。これは、jQueryの公式文書で推奨される方法でもあります。
コードコピーは次のとおりです。
var $ info = $( "#info");
$ .ajax({
// URLを変更してエラーが発生します
url: "/echo/json/"、
データ: {
json:json.stringify({
「名前」:「somevalue」
})
}、
タイプ:「投稿」
})
.done(function(response){
// 成功
$ info.text(respons.name);
})。fail(function(){
// 失敗
$ info.text( "悪いことが良い開発者に起こる");
})
.always(function(){
$ info.append( "... fally");
});
AngularJSがPromise Modeを使用する方法を見てみましょう。
コードコピーは次のとおりです。
var m = angular.module( "myApp"、[]);
M.Factory( "DataService"、function($ q){
function _callme(){
var d = $ q.defer();
setimeout(function(){
d.Resolve();
//defer.reject();
}、100);
D.Promiseを返します。
}
戻る {
callme:_callme
};
});
関数myctrl($ scope、dataservice){
$ scope.name = "none";
$ scope.isbusy = true;
dataservice.callme()
.then(function(){
// 成功
$ scope.name = "success";
}、
関数 () {
// 失敗
$ scope.name = "fails";
})
.then(function(){
//最終的な句のように
$ scope.isbusy = false;
});
}
これらの例をjsfiddleで試してみて、どのような効果が生成されるかを確認できます。非同期を操作するために約束を使用することは非常に簡単な方法であり、コードを簡素化することもできます。それは確かに1つの石で2羽の鳥を殺す良い方法です。
約束に関する詳細な紹介と例については、公式ウェブサイト(http://www.promisejs.org/)にアクセスできます。