【问题标题】:What/when does a call to the jQuery AJAX method return?什么/什么时候调用 jQuery AJAX 方法返回?
【发布时间】:2011-09-26 08:29:12
【问题描述】:

一点背景:

我正在尝试实现并支持 AJAX 的 SlickGrid。文档不多,所以我使用了this example as a base

在此示例中,有以下代码访问所需的 Web 服务以获取数据:

req = $.jsonp({
                    url: url,
                    callbackParameter: "callback",
                    cache: true, // Digg doesn't accept the autogenerated cachebuster param
                    success: onSuccess,
                    error: function(){
                        onError(fromPage, toPage)
                    }
                    });
                req.fromPage = fromPage;
                req.toPage = toPage;

I'm not exactly sure what jsonp does 但从我读过的内容来看,它似乎与 jQuery 中的 ajax 方法非常相似,只是它返回 json 并允许跨域请求。我碰巧调用的 web 服务只返回 XML,所以我将这段代码更改为:

req = $.ajax({
                url: "/_vti_bin/lists.asmx",
                type: "POST",
                dataType: "xml",
                data: xmlData,
                complete: onSuccess,
                error: function (xhr, ajaxOptions, thrownError) {
                    alert("error: " + xhr.statusText);
                    alert(thrownError);
                },
                contentType: "text/xml; charset=\"utf-8\""
            });
            req.fromPage = fromPage;
        req.toPage = toPage;

我的问题是我的页面在req.fromPage = fromPage; 处出错,因为req 为空。

我认为我可以将我的 jsonp 调用替换为对 ajax 方法的调用是错误的吗? req 只是没有设置,因为我的 ajax 调用在代码执行时还没有完成?我怎样才能解决这些问题?

如果我注释掉最后两行并将这些值硬编码到其他地方,一切都会正常运行。

【问题讨论】:

    标签: javascript jquery ajax jsonp slickgrid


    【解决方案1】:

    我认为我可以将我的 jsonp 调用替换为对 ajax 方法的调用是错误的吗?

    不,应该可以的。

    req 是不是因为在代码执行时我的 ajax 调用尚未完成而未设置?

    是的,没错。

    ajax 方法启动请求并立即返回。如果您想在响应到达后做某事,您应该在 success 事件处理程序中执行此操作。

    您实际上可能希望使用success 事件而不是complete 事件,因为即使出现错误,complete 事件也会发生。

    可以在设置中指定 async: false, 以使 ajax 调用等待响应,但这意味着浏览器在等待时会冻结。

    【讨论】:

    • 好的,很高兴知道。出于好奇,为什么 jsonp 方法不需要在 onSuccess 函数中设置 req 的值?这不会像 ajax 一样立即返回吗?
    • @Abe Miessler:这两种方法都是异步的,甚至不可能进行同步的 JSONP 调用。您从调用的返回值中获取 req 对象,这可能因方法而异。这两种方法都不能返回请求的结果,所以无论如何你都不应该为你的结果使用返回值。
    • 我知道jsonp 调用不会立即返回结果,但如果它没有抛出相同的错误,它必须立即返回 SOMETHING,对吗?
    • @Abe Miessler:它显然返回了某种对象,但这并不重要。首先,您不应该将该方法的返回值用于您的结果。只需创建一个新对象,这样您就知道它包含什么:var req = {};
    【解决方案2】:

    作为Guffa stated$.ajax() 异步工作。因此,您必须指定当请求返回响应时将调用的 callback,而不是只使用 $.ajax() 返回的任何内容。

    您可以指定几种不同的回调方法:

    • complete - 在收到响应时运行,无论其状态如何。
    • success - 当您收到带有成功状态码(通常为 200)的响应时运行。
    • error - 当您收到带有错误代码(例如 404 或 500)的响应时运行。

    要在请求成功后对响应正文执行某些操作,您应该执行类似的操作

    $.ajax({
        ...
        success: function(body) {
            alert('This is the method body:' + body);
        }
    });
    

    阅读documentation 中的不同方法,看看您可以使用哪些更多参数。

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2011-07-21
      • 1970-01-01
      • 2015-07-13
      • 2012-11-30
      相关资源
      最近更新 更多