2

私は、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でテスト済み

4

1 に答える 1

0

基本的に、それはthen()のドキュメントに次のように記載されているためです(強調は私のものです):

これらのフィルター関数は、プロミスまたはコールバックに渡される新しい値を返すか、解決済み/拒否されたステータスと値をプロミスのコールバックに渡す別の監視可能なオブジェクト (Deferred、Promise など) を返すことができます。使用されるフィルター関数が である場合、または指定されていない場合、promise は元の と同じ値で解決または拒否されます。.done().fail()null

したがって、失敗フィルターから単一の値を返すことができますが、これは必要なものではありません (2 つの値が必要です)。または、失敗フィルターを完全に省略してthen()、元の約束と同じ値を渡すことができます。

複数の値を返す失敗フィルターを実装する場合は、次の値ですぐに拒否する新しい Deferred オブジェクトを返すことができます。

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!");
    return $.Deferred().reject(jqXHR, state);
});
于 2013-02-18T15:42:06.893 に答える