เป็นไปได้ไหมที่จะตั้งค่า async: false เป็น $ .getJSON call


105

เป็นไปได้ไหมที่จะตั้งค่าasync: falseเมื่อโทร$.getJSON()เพื่อให้บล็อกการโทรแทนที่จะเป็นแบบอะซิงโครนัส


1
เพียงแค่ใส่รหัสของคุณในการติดต่อกลับ .... มีเหตุผลที่การยกเลิกการใช้งานนี้เป็นความคิดที่ไม่ดี
Milney

1
@Milney - แปลกมาก ... อย่างเป็นทางการก็จะเลิก; จริงมันเป็นไม่ได้ หากเลิกใช้งานไปแล้วจริงๆความเป็นไปได้ที่จะทำการซิงค์การโทร AJAX หรือสวิตช์ $ ajax.setup จะถูกทิ้งใน jQuery 3 ตามความเป็นจริงการโทรแบบซิงค์มีประโยชน์มากในบางครั้งเช่นเมื่อเริ่มต้นการเริ่มต้นทั่วโลกด้วย ข้อมูล JSON เมื่อคุณมี globals อื่น ๆ ที่อาศัยชุดแรก (การบรรจุกระบวนการเริ่มต้นทั้งหมดในฟังก์ชันการเรียกกลับอาจเป็นเรื่องยุ่งยากมากในบางสถานการณ์)
Brice Coustillas

คำตอบ:


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

ฉันสามารถใช้สิ่งนี้เพื่อโพสต์การโทรได้หรือไม่
Hitesh

@hitesh ใช่คุณจะเพิ่มtype: 'POST'ตัวเลือกเพื่อเปลี่ยนเป็นโพสต์แม้ว่าคุณจะไม่ต้องการใช้async: falseเว้นแต่ว่าคุณจำเป็นจริงๆ - มันจะล็อก UI ไว้
Nick Craver

1
'myData' ควรจะเป็นอะไรในกรณีนี้? เมื่อฉันลบข้อมูล: myData สมบูรณ์มันใช้งานได้ .. ค่อนข้างใหม่สำหรับการโทร ajax!
nclsvh

2
เพิ่งพบปัญหาใหม่ดังต่อไปนี้: "XMLHttpRequest แบบซิงโครนัสภายนอกคนงานกำลังอยู่ในขั้นตอนการลบออกจากแพลตฟอร์มเว็บเนื่องจากมีผลกระทบที่เป็นอันตรายต่อประสบการณ์ของผู้ใช้ปลายทาง (นี่เป็นกระบวนการที่ยาวนานซึ่งใช้เวลาหลายปี) นักพัฒนาต้อง อย่าส่งผ่านเท็จสำหรับอาร์กิวเมนต์ async เมื่ออ็อบเจ็กต์ส่วนกลางของการตั้งค่ารายการเป็นอ็อบเจ็กต์ Window ตัวแทนผู้ใช้ขอแนะนำอย่างยิ่งให้เตือนเกี่ยวกับการใช้งานดังกล่าวในเครื่องมือของนักพัฒนาและอาจทดลองด้วยการโยนข้อยกเว้น InvalidAccessError เมื่อเกิดขึ้น "
Ken Sharp

46

คำตอบผิดทั้งคู่ คุณสามารถ. คุณต้องโทร

$.ajaxSetup({
async: false
});

ก่อนที่คุณจะโทร json ajax และคุณสามารถตั้งค่าเป็น true หลังจากโทรซ้ำ (หากมีการใช้งานอื่น ๆ ของ ajax ในเพจหากคุณต้องการ async)


1
ฉันเพิ่งอ่านเอกสารส่วนนั้นซ้ำ นี่คือส่วนที่พูดถึง ajaxSetup: api.jquery.com/jQuery.ajaxSetup และนี่คือตัวเลือก: api.jquery.com/jQuery.ajax มันบอกอย่างชัดเจนว่า: "async Default: true โดยค่าเริ่มต้นคำขอทั้งหมดจะถูกส่งแบบอะซิงโครนัส ( เช่นนี้ถูกตั้งค่าเป็นจริงโดยค่าเริ่มต้น) หากคุณต้องการคำขอแบบซิงโครนัสให้ตั้งค่าตัวเลือกนี้เป็นเท็จคำขอข้ามโดเมนและ dataType: คำขอ "jsonp" ไม่สนับสนุนการทำงานแบบซิงโครนัส "JSONP ไม่ใช่ JSON ดังนั้นฉันยังคิดว่าฉันเป็น ตั้งแต่เริ่มต้น ฉันจะเขียนตัวอย่างในภายหลังเมื่อฉันมีเวลา
velja

7
นี่เป็นความคิดเห็นที่ล่าช้า แต่ ... คำตอบของ "ทั้งสอง" ข้อใดผิด? ฉันเห็นคำตอบจาก @Nick Craver เป็นทั้งที่ยอมรับได้และไม่ "ยุ่ง" กับการตั้งค่า AJAX ทั่วโลก (หากคำขออื่นเริ่มทำงานในเวลาเดียวกัน)
scunliffe

1
ใช้งานได้ แต่จะใช้กับคำขอของ ajax ทั้งหมดที่คุณทำในเพจ ดังนั้นฉันจะลงคะแนนเพราะฉันไม่อยากแนะนำ
GabrielBB

3
นี่เป็นคำตอบที่มีคุณภาพต่ำมาก
Brian Webster

1
-1: การทำสิ่งต่างๆแบบซิงโครนัสอาจมีค่าใช้จ่ายสูง คุณควรทำสิ่งนี้อย่างแน่นอนต่อการโทรเว้นแต่โครงการของคุณจะต้องใช้ทุกครั้ง คำตอบของคุณแสดงให้เห็นว่าคุณทั่วโลกกำหนดค่าสายทั้งหมดไป$.ajax(และห่อชวเลขที่ตามมาเช่น$.getJSON, $.getฯลฯ ) จะเป็นซิงโคร นอกจากนี้เอกสารยังแนะนำว่าอย่าใช้สิ่งนี้: "คำอธิบาย: ตั้งค่าเริ่มต้นสำหรับคำขอ Ajax ในอนาคตไม่แนะนำให้ใช้"
Carrie Kendall

19

ฉันคิดว่าคุณทั้งคู่พูดถูก คำตอบในภายหลังใช้งานได้ดี แต่เหมือนกับการตั้งค่าตัวเลือกส่วนกลางดังนั้นคุณต้องทำสิ่งต่อไปนี้:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

ในกรณีของฉัน 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));

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);
})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.