我有一个提供标准扩展点的javascript小部件。其中之一是beforecreate函数。它应该返回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,而不是在回调中。有没有使用jquery或其他浏览器API执行同步Ajax请求的方法?
解决这个问题的正确方法是重写小部件的扩展点使用承诺。通过这种方式,您可以轻松地将异步操作(如Ajax请求)设置为beforecreate。
我提出了sajak函数。我们有字母T吗?是的,范娜,给我3吨。
@科斯在现场。此处不需要同步xhr
如果在启动JavaScript时有人问我一条建议,我会说:拥抱JavaScript的异步特性,不要试图与之抗争。
您可以尝试使用embeddedjs.com
这个问题就像问"我如何以纯文本形式存储我的用户密码?"当然有答案,但不要这样做。
从你的jQuery文件:指定选项异步和同步的AJAX请求to get a false。然后你可以在一些数据集的回调函数,可你的妈妈。
这里是你的代码会建议:如果发生的样子。
beforecreate: function (node, targetNode, type, to) {
jQuery.ajax({
url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
success: function (result) {
if (result.isOk == false) alert(result.message);
},
async: false
});
}
确切地说,同步调用不可能使用get()、post()、load()。只有ajax()有"async"参数,可以设置为"false"。
@ SLA80不。自jquery 1.1以来:stackoverflow.com/questions/6849686/…
@愚蠢:如果您只希望某些请求是同步的,那么答案仍然是正确的,并且是相关的。
@qualifidial my comment针对sla80的错误注释;可以对同步调用使用get()、post()、load()。
只需注意,添加async:false对我来说非常有用,只要我将整个ajax函数设置为某个变量的值。例如,var ajaxresults = $.ajax({....。
jquery>=1.8不再支持async false。请参阅api.jquery.com/jquery.ajax
@jquery>=1.8中仍然支持ken async: false。将async: false与jqxhr($.Deferred)结合使用的能力是不赞成的。换句话说,必须使用更新的success/error/complete回调选项,而不是传统的方法,例如jqXHR.done()。
使用async:false是否安全,因为它将保留其余代码的执行。一旦得到Ajax的响应,只有到那时,其余的代码才会执行。如果服务器不响应Ajax请求,那么最好的处理方法是什么?如果服务器没有响应Ajax请求,是否应该添加超时以继续其他请求?
async已弃用
@伊贝尔:不,看本·约翰逊的评论。它与$.Deferred一起被弃用,而不是单独使用。
重要的是,对于jquery>