async: false
是否可以在不使用该选项(显然已被弃用)的情况下在 jQuery 中同步获取 JSON ?我也不希望将所有内容都放入成功功能中。
3 回答
不,除了 没有其他选择async: false
。如果有,我不会推荐它。
对于成功函数,您可以简单地传递另一个将要执行的函数。
例如:
$.ajax( {
url: myUrl,
type: 'POST',
success: myFunc
} );
function myFunc( datas ) {
// do what you should do in a success function
}
由于 jQuery 上的 ajax 方法返回一个Deferred Object
(jQuery 1.5+),您也可以编写
$.ajax({
url: myUrl,
type: 'POST'
}).done(function() {
// do what you should do in a success function
});
不合理。尝试在不使用 asyc:false 的情况下强制请求同步是可能的,但在我看来是浪费精力。在几乎所有想要使用 async:true 的场景中,您都可以使用 async:true 完成所有相同的事情,就像使用 async:false 一样。这只是你如何构建代码的问题。
如果您查看执行 AJAX 请求的源文件的当前版本: https ://github.com/jquery/jquery/blob/master/src/ajax/xhr.js
您会看到它仍然使用设置对象上的异步字段,该字段直接传递给 XMLHttpRequest 对象的 Open 方法。所以使用默认实现,你能做的就是设置“async:false”。
if ( s.username ) {
xhr.open( s.type, s.url, s.async, s.username, s.password );
} else {
xhr.open( s.type, s.url, s.async );
}
现在假设您真的很固执并且想要在不设置“async:false”的情况下执行此操作,您可以变得非常大胆并编写自定义 ajaxTransport 并将其注册为自定义数据类型。
这是我编写的一个示例,它使用 send 和 abort 方法创建自定义传输对象,并将其注册为 dataType 'mine'。因此,当您在 ajaxSettings 对象中指定 dataType 'mine' 时,它将使用此自定义传输而不是 jQuery 中内置的传输。http://jsfiddle.net/xrzc7/ 请注意,有两个 ajax 请求,一个带有显示警报的“我的”数据类型,一个没有不显示警报的数据类型。我在这个例子中的 ajaxTransport 没有完全发挥作用,它只是为了说明你可以在你自己的发送函数中进行交换。
我不建议为 jQuery 编写自己的 ajaxTransport,因为在我看来这确实不是必需的,但为了回答你的问题,我建议将其作为一个选项。
您应该密切注意 jquery 中默认的 ajaxTransport 是如何编写的,以及在编写自定义 ajaxTransport 时它如何与设置对象和回调方法交互。您的发送函数显然会强制将“假”值作为 XMLHttpRequest.open 方法的异步参数。
https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js - 这是默认 ajaxTransport 机制的当前源代码。
希望这会有所帮助,或者可能会说服您始终使用 async:true。:-D