3

async: false是否可以在不使用该选项(显然已被弃用)的情况下在 jQuery 中同步获取 JSON ?我也不希望将所有内容都放入成功功能中。

4

3 回答 3

3

不,除了 没有其他选择async: false。如果有,我不会推荐它。

对于成功函数,您可以简单地传递另一个将要执行的函数。

例如:

$.ajax( {
    url: myUrl,
    type: 'POST',
    success: myFunc
} );

function myFunc( datas ) {
    // do what you should do in a success function
}
于 2012-07-03T14:40:40.583 回答
3

由于 jQuery 上的 ajax 方法返回一个Deferred Object(jQuery 1.5+),您也可以编写

$.ajax({
    url: myUrl,
    type: 'POST'
}).done(function() {
  // do what you should do in a success function
});
于 2012-07-03T14:48:41.277 回答
1

不合理。尝试在不使用 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

于 2012-07-03T15:25:41.703 回答