【问题标题】:Always doesn't fire if there is just one fail如果只有一个失败,总是不会触发
【发布时间】:2016-06-10 18:08:22
【问题描述】:

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

我希望“总是”总是开火。到目前为止,我还没有找到问题的答案。 “完成”(我用于单个请求)不起作用。 “那么”也不行。

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 );
    }
  }
);

我的“有一些问题”部分从未到达

【问题讨论】:

标签: jquery ajax promise


【解决方案1】:

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

  • 你想计算你的 ajax 失败;
  • 如果在一系列 Deferred 对象中,其中一个失败,$.when.fail() 会触发,我认为这不是您要搜索的内容,或者,更好的是,我认为您的 ajax 调用调用的文件存在并且可以正确叫。另一方面,如果不是这样,你有两种可能:

    • ajax.fail() 上使用self.reject()
    • 考虑在您的 ajax 调用中检查 statusCode:

    $.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'));

为没有创建 Fiddle 提前道歉。

希望我的回答有帮助。

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多