GVKun编程网logo

jQuery.ajax – always()并不总是在运行(ajax不走success也不走error)

19

在本文中,我们将带你了解jQuery.ajax–always()并不总是在运行在这篇文章中,我们将为您详细介绍jQuery.ajax–always()并不总是在运行的方方面面,并解答ajax不走suc

在本文中,我们将带你了解jQuery.ajax – always()并不总是在运行在这篇文章中,我们将为您详细介绍jQuery.ajax – always()并不总是在运行的方方面面,并解答ajax不走success也不走error常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的ajax jquery总是运行错误、ajax – jQuery .always()似乎在$.get()请求实际完成之前触发、Ajax 技术一 ajax提交表单 jquery ajax教程 js ajax、javascript – 为什么我总是在jquery ajax的情况下得到401(未授权)错误

本文目录一览:

jQuery.ajax – always()并不总是在运行(ajax不走success也不走error)

jQuery.ajax – always()并不总是在运行(ajax不走success也不走error)

我正在使用jQuery.ajax进行REST调用并检索一些 JSON.它按预期工作.但是,当我强制执行错误条件(例如无效的URL)时,always方法不会触发.如果我设置crossDomain = false或dataType =’json’,那么总是会触发.但是,我不能在我的生产代码中这样做.如果你设置url =’ http://ip.jsontest.com/‘然后总是触发.我创建了一个小例子来说明问题:

var jqXHR = jQuery.ajax({
    type: 'GET',async: false,cache: false,url: 'http://ip.jsontest.com.BADURL/',contentType: 'application/json; charset=UTF-8',crossDomain: true,dataType: 'jsonp'
})
.done(function (data,textStatus,jqXHR) {
    console.log('Your IP is ' + data.ip);
    console.log('done was called');
})
.fail(function (jqXHR,errorThrown) {
    console.log('fail was called');
})
.always(function (dataOrjqXHR,jqXHRorErrorThrown) { console.log('always was called'); });

您可以在使用jQuery 1.9.1的jquery.com的控制台中运行它.我使用jQuery 1.11.1有相同的行为.当网址不可用时,我总是需要触发以处理时间.我在IE11,Chrome 38和FF 33中都有相同的行为.我做错了什么或者这是一个错误?
谢谢.

解决方法

这是JSONP调用已知的东西.根据 $.ajax参考错误:

Note: This handler is not called for cross-domain script and cross-domain JSONP requests.

另请注意,不支持同步JSONP调用:

Cross-domain requests and dataType: “jsonp” requests do not support synchronous operation.

解决方法通常涉及1)为调用设置超时或2)使用插件添加更多典型的错误功能.

1)设置超时(和async true)

var jqXHR = jQuery.ajax({
    type: 'GET',async: true,dataType: 'jsonp',timeout: 2000
})
.fail(function (jqXHR,errorThrown) {
    console.log('fail was called');
})
.done(function (data,jqXHR) {
    console.log('Your IP is ' + data.ip);
    console.log('done was called');
})
.always(function (dataOrjqXHR,jqXHRorErrorThrown) { console.log('always was called'); });

2)jQuery JSONP plugin增加了错误恢复功能.

ajax jquery总是运行错误

ajax jquery总是运行错误

每次运行我的ajax jquery函数,我得到一个错误,这是所有我的ajax调用。
这里是我的代码示例
function FindContact(CompanyName,DivisionName,FirstName,LastName) {

        $.ajax({
            url: 'Path',dataType: "json",async:false,type:'post',data: {'FirstName':FirstName,'LastName':LastName,'DivisionName':DivisionName,'CompanyName':CompanyName},success: displayContacts,error: ErrorMsg
        });
    }

为了摆脱这个我用这个

function ErrorMsg(result) {
        if (result.status == 200 && result.statusText == 'OK') {
            displayContacts(result);
        }
        else {
            alert("Failed : " + result.status + ' ' + result.statusText);
        }
    }

这是很困难的,因为我需要为每个ajax请求创建这样的方法。

为什么会运行错误代码第1?

请帮忙!

确保你返回的是有效的json。如果它不是,并且一切在服务器上正确,$ .ajax将会错误而不是成功。
function FindContact(CompanyName,dataType: "html or json",error: ErrorMsg
        });
    }

快速检查json是否有效是将dataType转换为html,看到成功被触发。如果它比你的json无效,如果你仍然遇到同样的问题,别的错误。

检查是否有效的json被返回的另一个方法是打开firebug,当请求发送时,单击响应选项卡,复制响应并获取到jsonlint.com以检查其是否有效。

Jquery ajax docs

ajax – jQuery .always()似乎在$.get()请求实际完成之前触发

ajax – jQuery .always()似乎在$.get()请求实际完成之前触发

这可能是我对 AJAX如何运行的误解,但我有一种情况,即在GET请求实际完成之前调用$.get回调(.always()).至少,这就是它的样子.

代码

var apiRequest  = 'some/url/';

// fetch list of video embed codes
$.get( apiRequest,function( embed_codes ) {

    // added this per Explosion Pills' answer
    var jqxhrs = [];

    // for each embed code,get video details (name,duration,etc.)
    for ( var i = 0; i < embed_codes.length; i++ ) {
        var videoDetailsRequest = '/v2/assets/' + embed_codes[i];
        //..declare vars..

        // fetch video details
        var jqxhr = $.get( videoDetailsRequest,function( video ) {
            // build playlist entry for each video
            playlistItem = '<li><h3>' + video.name + '</h3><p>' + video.description + '</p></li>';

            // create object of video HTML,with key = "video name" for sorting later
            videoArray[video.name] = playlistItem;
        },'jsonp' )

        // added this per Explosion Pills' answer
        jqxhrs.push( jqxhr );
    }

    // updated from jqxhr.always( function() {
    $.when( jqxhrs ).always( function() {
        // create array of keys
        for ( k in videoArray ) {
            if ( videoArray.hasOwnProperty( k ) ) { keys.push( k ); }
        }

        // append alphabetized list of videos to the page...
    });
},'jsonp' );

代码的作用

本质上,代码执行此操作:循环浏览视频嵌入代码列表.对于for循环的每次迭代,获取有关每个视频的详细信息并将这些细节推送到多维数组中.完成获取所有视频后,请调用.always()回调,该回调将视频分类为按字母顺序排列的播放列表并附加到页面.

问题

在获取所有视频之前,有时会调用.always()回调.播放列表中有9个视频,但有时在回拨被触发之前只返回6或7个视频,这意味着我的播放列表有点短.我已通过alert()键数和使用控制台对此进行了测试.我看到的是6-7个视频将返回,然后回调中的alert()会触发,然后返回剩余的视频.

我的问题:

为什么会这样?我认为在AJAX请求完成后触发了.always()回调.这是不是意味着在回调被触发之前应该返回所有视频?我怀疑它与AJAX中的“A”有关,但我认为always()回调的目的是解释这一点.非常感谢任何帮助我理解的东西.谢谢!

解决方法

你设置它的方式,一旦循环中的最后一个ajax请求完成,.always回调就会触发.这可能与其他人无关.当循环中的所有请求都已完成或外部请求已完成时,我无法判断是否要触发它.

对于外部请求,这很容易.只需将一个呼叫链接到.always(或.done,我相信它们是相同的,后者是首选).

如果您希望在完成所有其他ajax请求后完成,则可以使用$.when,它会检查所有延迟对象何时完成:

var jqxhrs = [];
   ...for loop...
   var jqxhr = $.get( videoDetailsRequest
   ...
   },'jsonp');
   jqxhrs.push(jqxhr);
...
$.when.apply(undefined,jqxhrs).always(function () { /* your intended callback */

或者,您可以使用.pipe:

//Create initial deferred object
var jqxhr = $.Deferred();
   ...for loop...
   jqxhr = jqxhr.pipe($.get(...
jqxhr.always(function () { /* callback */

Ajax 技术一 ajax提交表单 jquery ajax教程 js ajax

Ajax 技术一 ajax提交表单 jquery ajax教程 js ajax

javascript – 为什么我总是在jquery ajax的情况下得到401(未授权)错误

javascript – 为什么我总是在jquery ajax的情况下得到401(未授权)错误

我在jquery中使用ajax.当我提交我的价值时,我每次都会收到此错误.请让我知道我哪里错了?

  <script>
    $(document).ready(function(){
      $("button").click(function(){
        $.ajax({
          url: 'url_path',
          data: { 
            user : {
              email : $('#email').val(), 
              password : $('#password').val()
            } ,
            vendor_identifier : '3231-43423-fdsdfs'
          },
          dataType: 'jsonp',
            //method: 'POST',
            type:'POST',
            success: function(msg) {
              var msg = $.parseJSON(msg);
              console.log(msg);
            }
          });
      });
    });
  </script>

解决方法:

在您的示例中,您似乎正在访问某些需要通过电子邮件和密码进行身份验证的API. 401 Unauthorized只是说远程服务器由于某种原因无法使用电子邮件和密码以及您随请求发送的vendor_identifier的组合来验证用户.

可能是API在Authorization HTTP标头中需要Basic Authentication形式的用户名(电子邮件)和密码.如果您使用的是JQuery> = 1.7.2,那么它将为您创建Authorization标头.

看到这个问题:How to use Basic Auth with jQuery and AJAX?

$(document).ready(function(){
  $("button").click(function(){
    $.ajax({
    url: 'url_path',
      data: { 
      user : {
        email : $('#email').val(), 
        password : $('#password').val()
      },
      vendor_identifier : '3231-43423-fdsdfs'
    },
    username: $('#email').val(),
    password: $('#password').val(),
    dataType: 'jsonp',
    success: function(msg) {
    var msg = $.parseJSON(msg);
    console.log(msg);
  }
});

今天关于jQuery.ajax – always()并不总是在运行ajax不走success也不走error的分享就到这里,希望大家有所收获,若想了解更多关于ajax jquery总是运行错误、ajax – jQuery .always()似乎在$.get()请求实际完成之前触发、Ajax 技术一 ajax提交表单 jquery ajax教程 js ajax、javascript – 为什么我总是在jquery ajax的情况下得到401(未授权)错误等相关知识,可以在本站进行查询。

本文标签: