同步jQuery调用,而不是将所有内容都放在回调中

时间:2012-07-03 14:38:12

标签: javascript jquery json deprecated synchronous

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

3 个答案:

答案 0 :(得分:3)

不,除了async: false之外别无选择。如果有的话,我不推荐它。

对于成功函数,您只需传递另一个将要执行的函数。

例如:

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

function myFunc( datas ) {
    // do what you should do in a success function
}

答案 1 :(得分:3)

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

$.ajax({
    url: myUrl,
    type: 'POST'
}).done(function() {
  // do what you should do in a success function
});

答案 2 :(得分:1)

不合理。试图强制请求是同步而不使用asyc:false是可能的,但在我看来是浪费精力。在几乎每个你想要使用async:true的场景中,你都可以用async:true来完成所有相同的事情,就像使用async:false一样。这只是你如何构建代码的问题。

如果查看执行AJAX请求的源文件的当前版本: https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js

您将看到它仍然使用设置对象上的async字段,此字段将直接传递到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请求,其中一个带有显示警报的'mine'dataType,另一个带有不显示警报的数据类型。我在这个例子中的ajaxTransport功能不全,只是为了说明你可以交换你自己的发送功能。

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

您应该密切关注如何编写jquery中的默认ajaxTransport,以及在编写自定义ajaxTransport时它如何与设置对象和回调方法交互。你的send函数显然会强制一个“false”值作为XMLHttpRequest.open方法的async参数。

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

希望这会有所帮助,或者说服你总是使用async:true。 :-D