2016-06-10 82 views
0

只要每个请求返回成功,我的代码就能正常工作。但如果只有一次失败,“永远”不会失败。如果只有一个失败,总是不会触发

我希望“永远”总是要着火。到目前为止,我没有找到答案来解决我的问题。 “完整”(我用于单个请求)不起作用。 “那么”既不。

var counter = { ok:0, fail:0 }; 

for(var i in toDoList) 
{ 
    spRequest[i] = $.ajax({...}) 
    .done(function() { counter.ok ++; }) 
    .fail(function() { counter.fail ++; }); 
} 

$.when.apply(this, spRequest) 
.always 
(
    function() 
    { 
    if (spResp.ok == paybackTable.length) 
    { 
     console.log("everything went just fine"); 
    } 
    else 
    { 
     console.log("there were some problems:"); 
     console.log("- Requests OK: " + counter.ok); 
     console.log("- Requests failed: " + counter.fail); 
    } 
    } 
); 

我“有一些问题”一节中永远达不到

+0

这可能有所帮助: 在ajax中处理好错误,您的代码将能够执行$ .when.apply行。 http:// stackoverflow。com/questions/2810128/try-catch-with-jquery-ajax-request 使用window.onerror查看错误 – Destrif

回答

0

恕我直言有在你的代码一些不准确。首先,当你呼叫$.when.apply(),在.when()括号之间时,你必须把“$”作为第一个参数,然后你的数组spRequest。如果您使用jQuery.Deferred,则可以更好地控制Deferreds(ajax调用等)的最终结果。 因此,你推入spRequest数组你的Deferreds,这是尽快执行。 $.when.apply($,spRequest)等待所有的延期被解决或拒绝。 我特意在每一个ajax.fail()self.resolve()代替self.reject()是因为两个原因:

    你要计算你的Ajax失败
  • ;
  • 如果在一系列递延对象其中之一发生故障,$.when.fail()火灾和我想的是不是你要搜索什么,或者更好的,我想是存在的,以你的Ajax调用称为文件,并能正确调用。在另一方面,如果不是这样,你有两种可能性:

    • ajax.fail()使用self.reject();
    • 考虑到检查的StatusCode在您的Ajax调用:

    $.ajax({ statusCode: { 404: function() { //resolve and counter ++ stuffs in here } } });

这是一个例子目标您的需求:

*的index.php *

<html> 
<head> 
<title>TEST DEFERRED</title> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> 
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"> 
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> 
</head> 
<body> 
<h1>TEST DEFERRED</h1> 
<script src="js/test.js"></script> 
</body> 
</html> 

* test.js *

var counter = { ok:0, fail:0 } 
,toDoList = [1,2,3,4,5,6,7,8,9,10] 
,spRequest = []; 

for(var i in toDoList) 
{ 
    console.log(i, i&1); 
    if(i&1) 
    { 
    console.log('odd, request an ok ajax call'); 
    spRequest[i] = jQuery.Deferred(function(){ 
     console.log('function ok called!'); 
     var self = this; 

     $.ajax({ 
     url: 'ajax/ajax_return_ok.php', 
     async: true, 
     data : {}, 
     type: 'post', 
     dataType: 'json' 
     }).done(function(d) { 
     console.log(d); 
     if(d.is_error) 
     { 
      counter.fail ++; 
      self.resolve(); 
     } else { 
      counter.ok ++; 
      self.resolve(); 
     } 

     }).fail(function(j) { 
     console.log(j.responseText); 
     //# fail of ajax call 
     counter.fail ++; 
     self.resolve(); 
     }); 

    }); 
    } else { 
    console.log('odd, request an error ajax call'); 
    spRequest[i] = jQuery.Deferred(function(){ 
     console.log('function error called!'); 
     var self = this; 

     $.ajax({ 
     url: 'ajax/ajax_return_error.php', 
     async: true, 
     data : {}, 
     type: 'post', 
     dataType: 'json' 
     }).done(function(d) { 
     console.log(d); 
     if(d.is_error) 
     { 
      counter.fail ++; 
      self.resolve(); 
     } else { 
      counter.ok ++; 
      self.resolve(); 
     } 

     }).fail(function(j) { 
     console.log(j.responseText); 
     //# fail of ajax call 
     counter.fail ++; 
     self.resolve(); 
     }); 

    }); 
    } 

} 


jQuery.when.apply($,spRequest).done(function(){ 
    console.log('when done'); 
}).fail(function(){ 
    console.log('when fail'); 
}).always(function(){ 
    if (counter.fail === 0) 
    { 
    console.log("everything went just fine"); 
    } 
    else 
    { 
    console.log("there were some problems:"); 
    console.log("- Requests OK: " + counter.ok); 
    console.log("- Requests failed: " + counter.fail); 
    } 
}); 

* ajax_return_error.php *

<?php 
echo json_encode(array('is_error' => true,'error_message' => 'this is an error message')); 

* ajax_return_ok.php *

<?php 
echo json_encode(array('is_error' => false,'result' => 'ok')); 

道歉提前为没有创建小提琴。

希望我的回答有帮助。