2015-04-02 1 views
0

У меня есть набор функций getJson(), которые я вызываю последовательно, используя jquery отложенные.jQuery отложен: остановить ход, когда условие не подтверждено

function f1(){ $.getJSON(..)} 
function f2(){ $.getJSON(..)} 
.... 
function fn(){ $.getJSON(..)} 

var dfd = $.Deferred(); 
dfd.done(f1,f2...fn) 

dfd.resolve(); 

Дело в том, одна из функций может столкнуться с данной проблемой и вернуть ложных, в этом случае я хотел бы остановить прогресс и не вызывать остальные функции.

Как это сделать?

ответ

0

Два способа сделать это являются

1. Если ответы не зависят друг от друга

var req1 = $.getJSON(...).then(function(response1) { 
    //evaluate the response and either reject or resolve a Deferred based on the results of your evaluation 
    if(!response1) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response1); 
}); 

var req2 = $.getJSON(...).then(function(response2) { 
    //evaluate the response 
    if(!response1) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response2); 
}); 

var req3 = $.getJSON(...).then(function(response3) { 
    //evaluate the response 
    if(!response1) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response3); 
}); 

var req4 = $.getJSON(...).then(function(response4) { 
    //evaluate the response 
    if(!response1) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response4); 
}); 

$.when(req1,req2,req3,req4) 
    .then(
    function(response1,response2,response3,response4) { /* called when all requests are successfully complete */ }, 
    function() { /* called when any of the requests have failed */ } 
    ); 

2. Если ответы DO зависят друг от друга

$.getJSON(...) //req1 

.then(function(response1) { 

    //evaluate response1 
    if(!response1) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response1); 

}) 
.then(function(response1) { 

    return $.getJSON(...).then(function(response2) { 
    //evaluate the response 
    if(!response2) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response1,response2); 
    }); 

}) 
.then(function(response1,response2) { 

    return $.getJSON(...).then(function(response3) { 
    //evaluate the response 
    if(!response2) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response1,response2,response3); 
    }); 

}) 
.then(function(response1,response2,response3) { 

    return $.getJSON(...).then(function(response4) { 
    //evaluate the response 
    if(!response4) { return $.Deferred().reject(); } 
    return $.Deferred().resolve(response1,response2,response3,response4); 
    }); 

}) 
.then(

    function(response1,response2,response3,response4) { 
    //only called on success of all requests 
    }, 

    function() { 
    //called on failure of any individual request, or if the responses of any individual request did not meet your conditions 
    } 
) 

EDIT

Если вы выполняете их в функции, то вам просто необходимо вернуть обещание и приковать его к .then, как например:

function makeReqs() { 
    //method 1 
    return $.when(req1,req2,req3,req4); 

    //method 2 
    return $.getJSON(...) 
     .then(...) 
     .then(...) 
     .then(...) 


} 

//call the function 
makeReqs 
    .then(
    function() { /* this is called on success */ }, 
    function() { /* this is called on failure */ } 
    ) 
+0

.pipe был устаревшим JQuery 1.8 – peinearydevelopment

+0

@peinearydevelopment - спасибо , Я работал со старыми версиями в последнее время. Должен использовать '$. Then', я отредактирую. – Adam

+0

Спасибо, но как я могу инициировать успех или функцию отказа? – MahmoudKsemtini