我有一个提供标准扩展点的JavaScript小部件。其中之一是beforereate函数。它应该返回false以防止创建一个项。
我已经使用jQuery在这个函数中添加了一个Ajax调用:
beforecreate: function (node, targetNode, type, to) {
jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
function (result) {
if (result.isOk == false)
alert(result.message);
});
}
但是我想阻止小部件创建项目,所以我应该在母函数中返回false,而不是在回调中返回false。是否有一种方法可以使用jQuery或任何其他浏览器内API执行同步AJAX请求?
可以通过调用将jQuery的Ajax设置设置为同步模式
jQuery.ajaxSetup({async:false});
然后使用jQuery执行Ajax调用。Get(…);
然后再打开一次
jQuery.ajaxSetup({async:true});
我想它的工作原理与@Adam建议的一样,但它可能对那些想要重新配置jQuery.get()或jQuery.post()到更详细的jQuery.ajax()语法的人有帮助。
所有这些答案都忽略了一点,即使用async:false执行Ajax调用将导致浏览器挂起,直到Ajax请求完成。使用流控制库可以解决这个问题,而不需要挂起浏览器。下面是一个Frame.js的例子:
beforecreate: function(node,targetNode,type,to) {
Frame(function(next)){
jQuery.get('http://example.com/catalog/create/', next);
});
Frame(function(next, response)){
alert(response);
next();
});
Frame.init();
}
可以通过调用将jQuery的Ajax设置设置为同步模式
jQuery.ajaxSetup({async:false});
然后使用jQuery执行Ajax调用。Get(…);
然后再打开一次
jQuery.ajaxSetup({async:true});
我想它的工作原理与@Adam建议的一样,但它可能对那些想要重新配置jQuery.get()或jQuery.post()到更详细的jQuery.ajax()语法的人有帮助。
首先,我们应该了解什么时候使用$。当我们使用$。get/$。post时
当我们需要对ajax请求进行低级控制时,例如请求头设置、缓存设置、同步设置等,那么我们应该使用$.ajax。
$ . get /美元。post:当我们不需要对ajax请求进行低级控制时。仅简单地获取/发布数据到服务器。这是一种速记
$.ajax({
url: url,
data: data,
success: success,
dataType: dataType
});
因此,我们不能在$.get/$.post中使用其他特性(同步,缓存等)。
因此,对于ajax请求的低级控制(同步,缓存等),我们应该使用$.ajax
$.ajax({
type: 'GET',
url: url,
data: data,
success: success,
dataType: dataType,
async:false
});