我有一个提供标准扩展点的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>3.0的较新版本,不推荐使用async: false选项。因此,这个方法是不可实现的。
不是真的。截至此评论时,官方文档仍然没有将其列为已弃用,并且它在不生成警告的情况下工作。看到这个小提琴
请同时检查stackoverflow.com/questions/51112102/…
你可以把jQuery的Ajax程序通过调用在同步模式
jQuery.ajaxSetup({async:false});
然后将你的Ajax调用使用jQuery.get( ... );
它只是又一次转折。
jQuery.ajaxSetup({async:true});
我想同样的事情就是AS内的red"亚当,但它可能是一个乐于助人的人,不想reconfigure jQuery.get()或更多的jQuery.post()精心jQuery.ajax()友好的语法。
这真是个坏主意,你为什么要把它设定在全球一级?然后被迫取消设置?
至少,这是最好的坏主意。而不是说:"除了$.ajax()没有别的办法。";)
不应该全局设置。
优秀的解决方案。我注意到,当我试图实现它,如果我成功返回的a值为未定义的条款,它回来。我们有一个商店,它在一个变量的变量和回报。这是一个方法来:
function getWhatever() {
// strUrl is whatever URL you need to call
var strUrl ="", strReturn ="";
jQuery.ajax({
url: strUrl,
success: function(html) {
strReturn = html;
},
async:false
});
return strReturn;
}
这是因为您要从回调中返回一个值,而不是从getWhatever中返回。因此,你没有从你的getWhatever中返还任何东西,即undefined。
这绝对是错误的。当返回"strReturn"时,不能确保异步调用已完成。
这是一个同步调用(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();
}
如果您想为REST后端装配一个快速的测试工具,同步调用就很方便,而且比起回调地狱更喜欢简单。
function getURL(url){
return $.ajax({
type:"GET",
url: url,
cache: false,
async: false
}).responseText;
}
//example use
var msg=getURL("message.php");
alert(msg);
不过,请注意,您可能会得到这样的结果:"由于主线程上的同步xmlhttpRequest会对最终用户的体验造成不利影响,因此不推荐使用它。"
@hari在不使用主线程的情况下,使用jquery执行同步Ajax调用的方法是什么?
我看不出这个答案有什么可提供的,它只是一个被接受的答案,被包装成一个函数,四年后得到了答案。建议人们使用C+P是一件糟糕的事情,因为该函数并不表示它的作用。"那么getURL对get呢?为什么要挂我的浏览器?"等。
记住,如果你做跨域Ajax调用(使用jsonp)-你可以做的synchronously async标志将被忽略,由jQuery。
$.ajax({
url:"testserver.php",
dataType: 'jsonp', // jsonp
async: false //IGNORED!!
});
呼叫中心jsonp你可以使用:
Ajax调用你自己的域名做跨域调用服务器端
改变你的代码工作asynchronously
使用"函数库frame.js音序器"(这样回答)
这不是一块阻塞UI执行(本答案)(我最喜欢的方式)
注意:你不能使用async: false警告消息:由于本
Starting with Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), synchronous requests on the main thread have been deprecated due to the negative effects to the user experience.
铬对这甚至警告:在控制台
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
这是你的页面如果你正在做的东西,因为这样它可以停止营运的任何一天。
如果你想做一个安静的方式就像它安静不同步,但你应该使用异步/块然后等待着和一些可能是基于AJAX的,所以新的fetch API提供的样
async function foo() {
var res = await fetch(url)
console.log(res.ok)
var json = await res.json()
console.log(json)
}
编辑铬是在同步工作disallowing XHR解雇当页页是我们的navigated或封闭了由用户。本beforeunload自然pagehide,卸载,和visibilitychange。
如果这是你想要的,然后你的用例可能要看navigator.sendbeacon代替
因此,它是可能的一个同步请求和页面禁用HTTP headers或者允许或iframe的属性
请注意,您应该将await fetch(url)调用包装在try... catch块中,以捕获任何异步错误。
foo函数在开始时只是使用了async这个词,所以您也可以使用foo().catch(...)来捕捉它。
一种通过给定carcione答案和修改它使用JSON。
function getUrlJsonSync(url){
var jqxhr = $.ajax({
type:"GET",
url: url,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
function testGetUrlJsonSync()
{
var reply = getUrlJsonSync("myurl");
if (reply.valid == 'OK')
{
console.dir(reply.data);
}
else
{
alert('not valid');
}
}
我加了"datatype JSON和responsejson .responsetext到酒店。
我使用的组织状态的财产statustext返回的对象。注意,这是一个Ajax响应逆境状态,无论是有效的JSON。
安切洛蒂在后端到返回正确的响应(高型)返回的JSON对象,否则将是未定义的。
有两个方面的问题,回答时要考虑采取的原。一个程序的执行是synchronously AJAX(异步的设置:假)和其他的是在响应通过返回的返回语句调用函数,而比一个回调函数。
我尝试它和它的工作岗位。
我在去邮局了postdata和添加数据:
function postUrlJsonSync(url, postdata){
var jqxhr = $.ajax({
type:"POST",
url: url,
data: postdata,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
注意,上面的代码在只读的作品案例的WHERE异步是FALSE。如果你是一个真正的对象集jqxhr异步返回的是有效的在时间的Ajax调用返回后,只有当异步调用完成的,但太多太晚设置响应变量。
你把自己封闭在一async: false浏览器。一个非阻塞同步解决方案,你可以使用下面的:
es6 / ecmascript2015
你可以使用一个es6发电机&;Co库:
beforecreate: function (node, targetNode, type, to) {
co(function*(){
let result = yield jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value));
//Just use the result here
});
}
ES7
你可以使用asyc ES7在等待着。
beforecreate: function (node, targetNode, type, to) {
(async function(){
let result = await jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value));
//Just use the result here
})();
}
注意,您只需在创建beforecreate: async function(....之前传递async function并删除自调用的异步函数。
这是一个例子:
$.ajax({
url:"test.html",
async: false
}).done(function(data) {
// Todo something..
}).fail(function(xhr) {
// Todo something..
});
在基于承诺的解决方案中使用async false有什么意义?这只会锁定浏览器,一点好处也没有。
@Gonecoding在某些情况下,希望以精确的顺序执行代码,在这种情况下,我们可以使用async-false
@尼基:那绝对不是按顺序运行它们的方法。使用异步承诺(ajax调用已经返回)和.then()或done()(正如已经显示的那样)。锁定浏览器是非常糟糕的用户体验。正如我所说,在这个例子中使用async: false完全是浪费时间。
首先,我们应该了解何时使用$.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
});
因为不推荐使用XMLHttpReponse同步操作,所以我提出了以下封装XMLHttpRequest的解决方案。这使得有序的Ajax查询在本质上仍然是不对称的,这对于一次性使用CSRF令牌非常有用。
它也是透明的,因此jquery等库将无缝运行。
/* wrap XMLHttpRequest for synchronous operation */
var XHRQueue = [];
var _XMLHttpRequest = XMLHttpRequest;
XMLHttpRequest = function()
{
var xhr = new _XMLHttpRequest();
var _send = xhr.send;
xhr.send = function()
{
/* queue the request, and if it's the first, process it */
XHRQueue.push([this, arguments]);
if (XHRQueue.length == 1)
this.processQueue();
};
xhr.processQueue = function()
{
var call = XHRQueue[0];
var xhr = call[0];
var args = call[1];
/* you could also set a CSRF token header here */
/* send the request */
_send.apply(xhr, args);
};
xhr.addEventListener('load', function(e)
{
/* you could also retrieve a CSRF token header here */
/* remove the completed request and if there is more, trigger the next */
XHRQueue.shift();
if (XHRQueue.length)
this.processQueue();
});
return xhr;
};
这是我使用jquery对异步请求的简单实现。我希望这对任何人都有帮助。
var queueUrlsForRemove = [
'http://dev-myurl.com/image/1',
'http://dev-myurl.com/image/2',
'http://dev-myurl.com/image/3',
];
var queueImagesDelete = function(){
deleteImage( queueUrlsForRemove.splice(0,1), function(){
if (queueUrlsForRemove.length > 0) {
queueImagesDelete();
}
});
}
var deleteImage = function(url, callback) {
$.ajax({
url: url,
method: 'DELETE'
}).done(function(response){
typeof(callback) == 'function' ? callback(response) : null;
});
}
queueImagesDelete();