2016-08-29 4 views
2

複数のAjax呼び出しを持つ遅延オブジェクトwhenとすると、中断された(中止)はどのようにして停止することができますか?jQuery複数のAjaxを中止する場合

例コード(最小):

var deferred = $.when(
    $.getJSON("a.json"), 
    $.getJSON("b.json") 
) 
.done((res)=>{ 
    // whatever... 
}); 
// abort the all AJAX calls after N miliseconds 
setTimeout(()=>{ deferred.abort() }, 2000); 

しかしabort方法が存在しないので、もちろん、人は単にdeferred.abort()を行うことはできません。

+0

$ .getJSONによって返された値に中止がありますか? –

+0

'$ .getJSON'自体は' abort'メソッドを持っていますが、堅牢なソリューションが必要で、それぞれの '$ .getJSON'を手作業で変数につないで一つずつ打ち切らないようにしてください。 – vsync

答えて

5

これは$.whenから返される約束の機能ではありません。あなたは容易にかかわらず、それを自分で書くことができます:

function whenWithAbort(...xhrs) { 
    return { 
     abort() { 
      xhrs.forEach(xhr => { 
       xhr.abort(); 
      }); 
     }, 
     promise: $.when(...xhrs) 
    }; 
} 

は、使用方法(ただし、代替については下記を参照してください。):

var ops = whenWithAbort(
    $.getJSON("a.json"), 
    $.getJSON("b.json") 
) 
.promise.done((res)=>{ 
    // whatever... 
}); 
// abort the all AJAX calls after N miliseconds 
setTimeout(()=>{ ops.abort() }, 2000); 

あるいは実際に、より一般的に、ちょうどwhen - 配列付き:

function whenPlus(...list) { 
    return { 
     list, 
     promise: $.when(...list) 
    }; 
} 

次に:

var ops = whenWithAbort(
    $.getJSON("a.json"), 
    $.getJSON("b.json") 
) 
.promise.done((res)=>{ 
    // whatever... 
}); 
// abort the all AJAX calls after N miliseconds 
setTimeout(()=>{ ops.list.forEach(op => { op.abort() } }, 2000); 

それともあなたはそれをすべてのエントリの名前のメソッドを呼び出す方法与えることができる:私がやってしまった

var ops = whenWithAbort(
    $.getJSON("a.json"), 
    $.getJSON("b.json") 
) 
.promise.done((res)=>{ 
    // whatever... 
}); 
// abort the all AJAX calls after N miliseconds 
setTimeout(()=>{ ops.callOnEach("abort") }, 2000); 
+0

ありがとう良い答え。少し違った方法を選びましたが、より詳細な答えを(受け入れたように)マークしました。 – vsync

0

:次に

function whenPlus(...list) { 
    return { 
     list, 
     callOnEach(method) { 
      list.forEach(entry => { entry[method]() }); 
     }, 
     promise: $.when(...list) 
    }; 
} 

var ajaxCalls = [ 
    $.getJSON("a.json"), 
    $.getJSON("b.json") 
]; 

$.when(...ajaxCalls) 
    .done((res)=>{ 
     // whatever... 
    }); 

// abort the all AJAX calls after N miliseconds 
setTimeout(()=>{ ajaxCalls.forEach(a => a.abort()) }, 2000); 

whenメソッドの結果があまりにも悪いと、それに供給された引数のリストも公開されないため、直接アクセスすることができます(この場合は中止される可能性があります)。

関連する問題