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

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

131753 次浏览

I don't think you can set that option there. You will have to use jQuery.ajax() with the appropriate parameters (basically getJSON just wraps that call into an easier API, as well).

You need to make the call using $.ajax() to it synchronously, like this:

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

This would match currently using $.getJSON() like this:

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

Both answers are wrong. You can. You need to call

$.ajaxSetup({
async: false
});

before your json ajax call. And you can set it to true after call retuns ( if there are other usages of ajax on page if you want them async )

I think you both are right. The later answer works fine but its like setting a global option so you have to do the following:

    $.ajaxSetup({
async: false
});


//ajax call here


$.ajaxSetup({
async: true
});

Roll your own e.g.

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);
})

In my case, Jay D is right. I have to add this before the call.

$.ajaxSetup({
async: false
});

In my previous code, I have this:

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));

It works find. Then I change to

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

The alert is undefined.

If I add those three lines, the alert shows the data again.

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

If you just need to await to avoid nesting code:

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