jQuery 延迟:条件未验证时停止进度
jQuery deferred: stop progress when condition not verified
我有一组 getJson() 函数,我使用 jquery deferred 连续调用这些函数。
function f1(){ $.getJSON(..)}
function f2(){ $.getJSON(..)}
....
function fn(){ $.getJSON(..)}
var dfd = $.Deferred();
dfd.done(f1,f2...fn)
dfd.resolve();
问题是,其中一个函数可能会遇到给定的问题并且 return False,在这种情况下我想停止进度而不是调用剩余功能。
我该怎么做?
您可以通过两种方式做到这一点
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
}
)
编辑
如果您在函数中执行这些操作,那么您只需要 return 承诺并将其链接到 .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 */ }
)
我有一组 getJson() 函数,我使用 jquery deferred 连续调用这些函数。
function f1(){ $.getJSON(..)}
function f2(){ $.getJSON(..)}
....
function fn(){ $.getJSON(..)}
var dfd = $.Deferred();
dfd.done(f1,f2...fn)
dfd.resolve();
问题是,其中一个函数可能会遇到给定的问题并且 return False,在这种情况下我想停止进度而不是调用剩余功能。
我该怎么做?
您可以通过两种方式做到这一点
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
}
)
编辑
如果您在函数中执行这些操作,那么您只需要 return 承诺并将其链接到 .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 */ }
)