同步 jQuery 调用,无需将所有内容放入回调中
Synchronous jQuery calls, without putting everything in the callback
是否可以在不使用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
- 成功回调永远不会被JSONP请求调用
- 为什么(如何)'这'从函数内部调用回调时发生更改
- 如何在点击超链接时调用fullcalendar回调
- 在初始函数完成之前调用回调函数
- 未为路由器应用程序调用Node.Js的回调
- 对中的函数调用进行排序是回调的唯一方法
- Node.js exec调用从不调用回调
- 如何从参数数组中调用回调
- 当我的单元测试失败时,回调被调用了两次
- 回调函数(如afterMove)不被调用
- 如何使用jQuery等待来自回调的异步调用
- FireFox webrtc createoffer,没有任何回调调用
- 如何识别函数是作为方法调用还是作为回调调用
- jquery方法不是从angular回调调用的
- 从回调调用asyncwait
- 你可以使用PhoneGap和iOS从本地代码(而不是回调)调用javascript函数吗?
- Backbone model.fetch()回调(调用setTimeout)中的作用域问题
- React.js:你用一个不可调用的回调调用了' setState '
- 从图表.js选项回调调用 TypeScript 函数
- 如何将js函数从异步调用转换为回调调用