ajax非异步请求,关于javascript:如何让jquery执行同步而非异步的Ajax请求?

本文探讨了如何在JavaScript中使用jQuery执行同步Ajax请求。问题源于希望在beforecreate函数中返回false以阻止创建操作,而当前的异步Ajax调用无法满足这一需求。解决方案包括使用jQuery的ajax()函数设置async参数为false,以及考虑使用Promise或async/await进行同步处理。然而,同步Ajax请求可能会导致浏览器阻塞,因此建议采用异步处理并管理回调或使用现代JavaScript特性以避免回调地狱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个提供标准扩展点的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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值