1

一点背景:

我正在尝试实现 AJAX 驱动的 SlickGrid。没有太多文档,所以我使用这个例子作为基础

在此示例中,有以下代码访问所需的 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;

我不确定 jsonp 做了什么,但从我读过的内容来看,它似乎与 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 调用是错误的吗?req 只是没有设置,因为我的 ajax 调用在代码执行时还没有完成?我怎样才能解决这些问题?

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

4

2 回答 2

1

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

不,那应该工作得很好。

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

对,那是正确的。

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

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

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

于 2011-06-30T21:49:46.277 回答
0

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

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

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

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

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

阅读有关不同方法的文档,以了解您可以使用哪些更多参数。

于 2011-06-30T21:58:57.693 回答