同步 jQuery 调用,无需将所有内容放入回调中

Synchronous jQuery calls, without putting everything in the callback

本文关键字:回调 调用 jQuery 同步      更新时间:2023-09-26

是否可以在不使用async: false选项(显然已被弃用)的情况下同步获取jQuery中的JSON?我也不想把所有东西都放在成功函数中。

不,除了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并使用自定义数据类型注册它。

下面是我编写的一个示例,该示例使用发送和中止方法创建自定义传输对象,并将其注册为数据类型"mine"。 因此,当您在ajaxSettings对象中指定dataType 'mine'时,它将使用此自定义传输,而不是jQuery中内置的传输。http://jsfiddle.net/xrzc7/请注意,有两个 ajax 请求,一个具有显示警报的"mine"数据类型,另一个没有显示警报的数据类型。在这个例子中,我的ajaxTransport功能不全,它只是为了说明你可以交换自己的发送函数。

我不建议为jQuery编写自己的ajaxTransport,因为在我看来它真的没有必要,但是为了回答你的问题,我建议将其作为一种选择。

在编写自定义 ajaxTransport 时,您应该密切注意 jquery 中的默认 ajaxTransport 是如何编写的,以及它如何与设置对象和回调方法交互。 你的发送函数显然会强制使用"false"值作为XMLHttpRequest.open方法的异步参数。

https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js - 这是默认 ajaxTransport 机制的当前源代码。

希望这有所帮助,或者说服您始终使用 async:true。 :-D