我有一组getJson()函数,我使用jquery deferred连续调用。
function f1(){ $.getJSON(..)}
function f2(){ $.getJSON(..)}
....
function fn(){ $.getJSON(..)}
var dfd = $.Deferred();
dfd.done(f1,f2...fn)
dfd.resolve();
问题是,其中一个函数可能遇到一个给定的问题并返回 False ,在这种情况下我想停止进度而不是调用剩余的函数。
我该怎么做?
答案 0 :(得分: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。如果答案相互依赖
$.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
}
)
修改强>
如果您在函数中执行这些操作,那么您只需返回承诺并将其链接到.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 */ }
)