什么/什么时候调用jQuery AJAX方法返回?

时间:2011-06-30 21:42:45

标签: javascript jquery ajax jsonp slickgrid

一点背景:

我正在尝试实现和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为空。

我认为我可以通过调用ajax方法替换我的jsonp调用是错误的吗?是否因为我的ajax调用在代码执行时尚未完成而没有设置req?我怎样才能解决其中任何一个问题?

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

2 个答案:

答案 0 :(得分:1)

  

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

不,这应该可以正常工作。

  

是否因为我的ajax调用在代码执行时没有完成而没有设置req?

是的,这是正确的。

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

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

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

答案 1 :(得分:0)

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

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

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

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

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

documentation上阅读不同的方法,了解您可以使用的参数。