是否可以将async:false设置为$ .getJSON调用


105

可以async: false在调用时进行设置,$.getJSON()以使调用阻塞而不是异步进行吗?


1
只要把你的代码在回调....有不赞成这种方式有原因的-这是一个坏主意
Milney

1
@Milney —非常奇怪……正式地说,它已被弃用;实际上不是。如果确实不建议使用它,则在jQuery 3中将不再进行同步AJAX调用或$ ajax.setup开关的可能性。事实上,同步调用有时非常有用,例如,使用JSON数据,当您有其他依赖于第一批的全局变量时。(在某些情况下,将整个初始化过程包装在回调函数中可能会非常棘手。)
Brice Coustillas

我认为同步XHR请求或重组代码将解决这种情况。
Chetabahana

Answers:


154

您需要$.ajax()同步进行呼叫,如下所示:

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    //stuff
    //...
  }
});

这将与当前使用的匹配,$.getJSON()如下所示:

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});

23
我发现便利方法$ .getJSON()几乎永远不会有用,并且总是以$ .ajax()结尾。
Jacob Marble

我也可以将其用于POST呼叫吗?
Hitesh

@hitesh是的,您也要添加一个type: 'POST'选项以将其转换为帖子-尽管您async: false除非真正需要就不想使用它,否则它将锁定UI。
尼克·克雷弗

1
在这种情况下,“ myData”应该是什么?当我删除数据时:myData完全可以正常工作。对ajax调用来说还很新!
nclsvh 2015年

2
刚刚遇到了以下新问题:“工作人员外部的XMLHttpRequest同步正在从Web平台中删除,因为它会对最终用户的体验产生不利影响。(这是一个漫长的过程,需要很多年。)开发人员必须当入口设置对象的全局对象是Window对象时,请不要为async参数传递false。强烈建议用户代理警告开发人员工具中的此类用法,并可以尝试在发生InvalidAccessError异常时抛出异常。
肯·夏普

46

这两个答案都是错误的。您可以。你需要打电话

$.ajaxSetup({
async: false
});

在您的json ajax调用之前。并且您可以在调用重新跳转后将其设置为true(如果希望页面异步,则在页面上还有ajax的其他用法)


1
我只是重新阅读了那部分文档。这是谈论ajaxSetup的部分:api.jquery.com/jQuery.ajaxSetup 这是选项:api.jquery.com/jQuery.ajax 它清楚地说:“ async默认值:true默认情况下,所有请求都是异步发送的(即默认情况下将其设置为true。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“ jsonp”请求不支持同步操作。” JSONP不是JSON,所以我仍然认为我是从一开始就正确。有空的时候我会写示例。
velja 2011年

7
这是一个较晚的评论,但是...这两个答案都是错误的?我认为@Nick Craver的答案对于全球AJAX设置既可以接受,也不可以“弄乱”(如果同时
发出

1
它可以工作,但这将适用于您在页面中发出的所有ajax请求。因此,我将
投票否决,

3
这是一个质量很低的答案
Brian Webster

1
-1:使事物同步可能会付出高昂的代价。除非您的项目每次都绝对需要,否则您绝对应该按呼叫进行此操作。你的回答表明,你全局配置到所有的呼叫$.ajax(以及随后的简写,即包装$.getJSON$.get等等)是同步的。此外,文档甚至建议不要使用此功能:“描述:为将来的Ajax请求设置默认值。不建议使用。”
卡莉·肯德尔

18

我认为你们俩都是对的。后面的答案很好用,但是就像设置全局选项一样,因此您必须执行以下操作:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

就我而言,杰伊D是对的。我必须在通话之前添加它。

$.ajaxSetup({
    async: false
});

在我之前的代码中,我有这个:

var jsonData= (function() {
    var result;
    $.ajax({
        type:'GET',
        url:'data.txt',
        dataType:'json',
        async:false,
        success:function(data){
            result = data;
        }
    });
    return result;
})();
alert(JSON.stringify(jsonData));

它可以找到。然后我换成

var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

警报未定义。

如果我添加这三行,警报将再次显示数据。

$.ajaxSetup({
    async: false
});
var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

1

如果只需要await避免嵌套代码:

let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
    json = data;
    done();
}));

0

我认为您无法在此处设置该选项。您将必须使用具有适当参数的jQuery.ajax()(基本上,getJSON 还将该调用也包装到一个更简单的API中)。


0

自己滚

function syncJSON(i_url, callback) {
  $.ajax({
    type: "POST",
    async: false,
    url: i_url,
    contentType: "application/json",
    dataType: "json",
    success: function (msg) { callback(msg) },
    error: function (msg) { alert('error : ' + msg.d); }
  });
}

syncJSON("/pathToYourResouce", function (msg) {
   console.log(msg);
})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.