เป็นไปได้ไหมที่จะตั้งค่าasync: false
เมื่อโทร$.getJSON()
เพื่อให้บล็อกการโทรแทนที่จะเป็นแบบอะซิงโครนัส
เป็นไปได้ไหมที่จะตั้งค่าasync: false
เมื่อโทร$.getJSON()
เพื่อให้บล็อกการโทรแทนที่จะเป็นแบบอะซิงโครนัส
คำตอบ:
คุณต้องโทรออกโดยใช้$.ajax()
มันพร้อมกันเช่นนี้:
$.ajax({
url: myUrl,
dataType: 'json',
async: false,
data: myData,
success: function(data) {
//stuff
//...
}
});
สิ่งนี้จะตรงกับปัจจุบันโดยใช้$.getJSON()
ดังนี้:
$.getJSON(myUrl, myData, function(data) {
//stuff
//...
});
type: 'POST'
ตัวเลือกเพื่อเปลี่ยนเป็นโพสต์แม้ว่าคุณจะไม่ต้องการใช้async: false
เว้นแต่ว่าคุณจำเป็นจริงๆ - มันจะล็อก UI ไว้
คำตอบผิดทั้งคู่ คุณสามารถ. คุณต้องโทร
$.ajaxSetup({
async: false
});
ก่อนที่คุณจะโทร json ajax และคุณสามารถตั้งค่าเป็น true หลังจากโทรซ้ำ (หากมีการใช้งานอื่น ๆ ของ ajax ในเพจหากคุณต้องการ async)
$.ajax
(และห่อชวเลขที่ตามมาเช่น$.getJSON
, $.get
ฯลฯ ) จะเป็นซิงโคร นอกจากนี้เอกสารยังแนะนำว่าอย่าใช้สิ่งนี้: "คำอธิบาย: ตั้งค่าเริ่มต้นสำหรับคำขอ Ajax ในอนาคตไม่แนะนำให้ใช้"
ฉันคิดว่าคุณทั้งคู่พูดถูก คำตอบในภายหลังใช้งานได้ดี แต่เหมือนกับการตั้งค่าตัวเลือกส่วนกลางดังนั้นคุณต้องทำสิ่งต่อไปนี้:
$.ajaxSetup({
async: false
});
//ajax call here
$.ajaxSetup({
async: true
});
ในกรณีของฉัน Jay 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));
หากคุณต้องการawait
หลีกเลี่ยงการซ้อนโค้ด:
let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
json = data;
done();
}));
ฉันไม่คิดว่าคุณจะตั้งค่าตัวเลือกนั้นได้ คุณจะต้องใช้jQuery.ajax ()กับพารามิเตอร์ที่เหมาะสม (โดยทั่วไป getJSON จะรวมการเรียกนั้นเข้าสู่ API ที่ง่ายกว่าด้วย)
ม้วนของคุณเองเช่น
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);
})