jQuery的AJAX多个呼叫(jquery-ajax multiple calls)

2019-09-23 10:13发布

我使用下面的代码有这样多的Ajax请求:

要求1点开始 | 要求1点结束 | 要求2开始 | 要求2完成 | ...

这是代码:

var startingpoint = fireRequest(1);
    $.each(types,function(ix,type) 
    {
       startingpoint = startingpoint.pipe( function() 
       {
          alert(startingpoint.status); // undefined
          return fireRequest(type);
        });
    });

fireRequest只是一个switchcase到返回$阿贾克斯(...)正确的AJAX功能

我想链条停止,当一个请求失败。 我开始实施,并作为一个测试,我想提醒AJAX对象的状态,但它显示“未定义”。 我怎样才能获得状态?

Answer 1:

你想实现的行为已经是.pipe()方法的行为。 它有两个回调作为参数,只会执行完成回调,并沿链继续,如果先前的请求成功。 这可以在下面的jsfiddle来说明: http://jsfiddle.net/dflor003/Vq2YF/ (注:已内置JSON.stringify支持和执行console.log支持浏览器中打开此)

如果你想检查请求的状态,将采取的状态作为第二个参数进行回调。 更多细节可以在jQuery的API文档网站上找到: http://api.jquery.com/deferred.pipe/



Answer 2:

JS例1

此代码假定你要放弃其他请求如果任何一个请求失败(通过404或500的响应,或超时),而并不需要评估的数据响应,以确定业务逻辑故障情况。 $。当()

该方法将解决其主人尽快递延因为所有的Deferreds决心,或拒绝只要Deferreds的一个被拒绝延期的主人。

    $.when(fireRequest(1), fireRequest(2),fireRequest(3))
  .then(myAllSuccessfulFunc, oneFailedFunc);

function myAllSuccesfulFunc(req1,req2,req3){
//everything returned a 200.
   alert("these are not the droids you are looking for");
};
function oneFailedFunc(req1,req2,req3){
    //* each req looks like [ "not success", statusText, jqXHR ] */
//feel free to check what failed, but I don't know what you need

   req1[2].abort();
   req2[2].abort();
   req3[2].abort();
};

JS例2

你真正需要的响应解析为数据请求成功,看看你应该从后端失败的原因逻辑其他请求。

var stop = 4;
//if you are sure fireRequest(x) returns a good promise object, do this:
callNext(fireRequest(1),1);

function callNext(promise, currentIndex){
   promise.done(function(ajaxArgs){
   var jqXHR = ajaxArgs[2];
//replace this with some logic check that makes sense to your app
   if(/error/.test(jqXHR.responseText)){
    //do something
   }else if(currentIndex <stop){
    callNext(fireRequest(currentIndex+1),currentIndex+1);
   }).fail(function(ajaxArgs){
   //server returned a 404, or a 500, or something not a success.
   });
};


Answer 3:

我认为这个问题是$.Deferred和喜欢是专为处理异步和同步程序,所以你将永远必须以某种方式欺骗他们,如果你想要让他们采取行动你所描述的方式。

如果你想/需要处理您的通话一前一后( 使用 JAX)我建议把它们放入一个数组,并使用一个简单的递归函数来遍历数组,直到所有调用完成或其中的一个失败。

这基本上是一样的工作:

var requests = [
  {
  url : '/serviceA'
  data : myParams4ServiceA
  },
  ...
  {
  url : '/serviceZ'
  data : myParams4ServiceZ
  }
];

现在,你有AJAX的Array要求,你可以建立一个递归函数将通过逐一的工作:

function work(){

$.ajax(requests[0]).done(function(data){
  //handle data here
  requests.shift(); //request is done and can be removed from the Array, request[0] will now be the next request in the queue

  if (requests.length){
    work(); //function calls itself again if there's still need for it
  } else {
    // we are done!
  }

}).fail(function(e){
  //call failed -> handle error
});

}

work();

这拨弄一个成功的连锁的一个例子, 这一次对一个失败的链条。

另一种可能性是设置AJAX调用async : false (注意,这是不推荐使用jQuery中1.8+:“ 在jQuery 1.8,采用异步的:与jqXHR($ .Deferred)已被弃用假;必须使用完整的。/成功/错误回调 “,这是再次向上指向美国),并且使用简单$.when().then().fail()说,您对像的请求阵列链式:

$.when.apply($, requests).then(function(){

    $.each(arguments, function(){
        //do stuff with your data
    });

}).fail(function(){

    //handle the error

});

当你的呼叫现在阻止这也将连续处理它们。 见小提琴为这一点。



文章来源: jquery-ajax multiple calls