私は、jQueryの約束の基本もカバーするプレゼンテーション用のサンプル資料を準備しており、そうすることでいくつかの奇妙な振る舞いに遭遇しています。皆さんがこれについて私を助けてくれることを願っています。
私は完全にうまく機能する次のコードを持っています。
var getHTML1 = $.ajax({
url: "jquerypromises.html",
type: "GET"
});
getHTML1.done(function(responseText, state, jqXHR){
console.log("success from AJAX request with promises : getHTML1!");
});
getHTML1.fail(function(){
console.log("error from AJAX request with promises : getHTML1!");
});
//this one will call the failure callback!!!!!!
var getHTML2 =
$.ajax({
url: "somenonexistingpage.html", //<== THIS WILL call the failure callback
type: "GET"
})
.then(
function(){
console.log("success from AJAX request with promises : getHTML2!");
}
,
function(jqXHR, state){
console.log("error from AJAX request with promises : getHTML2!");
}
);
このコードはgetHTML1
、doneハンドラーが呼び出されgetHTML2
、失敗ハンドラーが呼び出された場合に実行されます。
ここで、上記のコードの下に次のコードを追加すると、
$.when(getHTML1, getHTML2).then(
function(response1, response2) {
// both arguments are arrays with[responseText, "success", jqXHR]
console.log("Both promises went successfull");
console.dir(response1);
console.dir(response2);
},
function(jqXHR, status) {
console.log("One of both promises went wrong!");
console.log(jqXHR);
console.log(status);
}
);
ここでも、適切なハンドラーが呼び出されています。この場合、失敗コールバックが呼び出されていますが、その引数はすべて未定義です。どうしてこれなの?
then()
ブロック内の障害ハンドラーを削除すると、のコードは次のgetHTML2
ようになります。
var getHTML2 =
$.ajax({
url: "somenonexistingpage.html", //<== THIS WILL call the failure callback
type: "GET"
})
.then(
function(){
console.log("success from AJAX request with promises : getHTML2!");
}
);
これですべてが期待どおりに機能し、2番目のthen()ブロックの障害ハンドラーが引数が入力された状態で呼び出されています。
jQuery1.9.1を使用してChromeでテスト済み