$.ajax()成功调用,但不会运行方法

$.ajax() success called, but will not run method

本文关键字:运行 方法 调用 ajax 成功      更新时间:2023-09-26

这真的让我很困惑。知道为什么会这样吗?

这段代码可以工作:

 $.ajax({
            type: 'GET',
            dataType: 'json',
            url: 'http://localhost:3235/Users/searchUsers?callback=?&searchString=' + searchString,
            success: alert("Success")
        });

这个代码没有:

 $.ajax({
            type: 'GET',
            dataType: 'json',
            url: 'http://localhost:3235/Users/searchUsers?callback=?&searchString=' + searchString,
            success: function(data){
              alert("Success");
            }
        });

第一个代码段语法不好,不应该使用,您会得到警告,因为它是立即调用的,而不是在成功时调用的。

没有收到第二个代码片段的警告只有两个原因。

  1. 服务器没有返回成功状态码,例如,它是404、500等,而不是200。
  2. 唯一的其他可能性是返回的jsonp不是jsonp,或者不是有效的jsonp。

很可能你混淆了JSONP和JSON,所以我给你每个例子。首先是json:

{"foo":"bar"}

这是JSONP ...?callback=somecallbackname&...:

somecallbackname({"foo":"bar"})

注意,somecallbackname将由jQuery提供,您必须获得回调get参数的值,并使用它来生成相应的JSONP

第一个"工作"是因为代码中的错误。它正在调用警报并存储它在成功回调中返回的内容。

添加一个错误处理程序来查看实际问题是什么。

 $.ajax({
            type: 'GET',
            dataType: 'json',
            url: 'http://localhost:3235/Users/searchUsers?callback=?&searchString=' + searchString,
            success: function(data){
              alert("Success");
            },
            error: function (xhr, status, msg) {
              console.log(status, msg);
            }
        }); 

如果无法触发错误处理程序。查看JavaScript控制台上的net选项卡,并查看http请求。您将看到服务器返回的错误。

您从第一个代码片段获得的警告是误导性的。

alert("Success")被分配给success属性时,您实际上立即调用它。

你的第二种方法是你想要的。

第一个例子是错误的- alert("Success")的结果被分配为回调,而不是函数。

您的第二个示例更接近,但是您混淆了JSON和JSONP。如果你的服务返回JSON,你应该从你的请求url中删除callback=?(实际上,你可以删除它,设置dataType:'jsonp'会自动添加它)。

var ajax_url = 'http://example.com:3235/Users/searchUsers?searchString=' + searchString;
$.ajax({
    type: 'GET',
    dataType: 'json',
    url: ajax_url,
    success: function(data){
        alert("Success");
    },
    error: function(xhr, status, error){
        alert("Error: " + status + " " + error);
    },
    complete: function(xhr, status){
        alert("Complete: " + status);
    }
});