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 */ }
   )