一点背景:
我正在尝试实现和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?我怎样才能解决其中任何一个问题?
如果我注释掉最后两行并在其他地方对这些值进行硬编码,一切运行正常。
答案 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上阅读不同的方法,了解您可以使用的参数。