क्या async सेट करना संभव है: $ .getJSON कॉल के लिए गलत


105

क्या async: falseकॉल करते समय सेट करना संभव है $.getJSON()ताकि कॉल अतुल्यकालिक होने के बजाय ब्लॉक हो जाए?


1
बस अपना कोड कॉलबैक में डाल दें .... एक कारण है कि यह पदावनत है - यह एक बुरा विचार है
मिलनी

1
@Milney - बहुत अजीब ... आधिकारिक तौर पर, यह है पदावनत; वास्तव में, यह नहीं है । यदि यह वास्तव में पदावनत किया गया था, तो या तो एक AJAX कॉल या $ ajax.setup स्विच करने की संभावना jQuery में छोड़ दी गई होगी। 3. वास्तव में, एक सिंक कॉल कभी-कभी बहुत उपयोगी होती है, उदाहरण के लिए प्रारंभिक ग्लोबल्स के साथ। JSON डेटा, जब आपके पास अन्य ग्लोबल्स होते हैं जो पहले बैच पर भरोसा करते हैं। (कॉलबैक फंक्शन में पूरी इनिशियलाइज़ेशन प्रक्रिया को
पैक करना

मुझे लगता है कि सिंक्रोनस एक्सएचआर अनुरोध या रीस्ट्रक्चर कोड इस मामले का जवाब देंगे।
चेतबाहना

जवाबों:


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 () का उपयोग करके समाप्त होता है।
जैकब मार्बल

क्या मैं POST कॉल के लिए भी इसका उपयोग कर सकता हूं?
हितेश

@ हितेश हाँ, आप type: 'POST'इसे पोस्ट में बदलने के लिए एक विकल्प भी जोड़ेंगे - हालाँकि आप async: falseतब तक उपयोग नहीं करना चाहते जब तक आपको वास्तव में ज़रूरत न पड़े - यह UI को लॉक कर देगा।
निक Craver

1
इस मामले में case myData ’क्या माना जाता है? जब मैं डेटा हटाता हूं: myData पूरी तरह से यह काम करता है .. बहुत बढ़िया अजाक्स कॉल करने के लिए!
nclsvh

2
बस निम्नलिखित नई समस्या से टकराया: "श्रमिकों के बाहर सिंक्रोनस XMLHttpRequest वेब प्लेटफ़ॉर्म से निकाले जाने की प्रक्रिया में है क्योंकि इसका अंतिम उपयोगकर्ता के अनुभव पर हानिकारक प्रभाव पड़ता है। (यह एक लंबी प्रक्रिया है जो कई वर्षों तक चलती है।) जब प्रवेश सेटिंग्स ऑब्जेक्ट की वैश्विक ऑब्जेक्ट एक विंडो ऑब्जेक्ट है, तो एस्किंस तर्क के लिए गलत नहीं पास। उपयोगकर्ता एजेंटों को डेवलपर टूल में इस तरह के उपयोग के बारे में चेतावनी देने के लिए दृढ़ता से प्रोत्साहित किया जाता है और ऐसा होने पर एक InvalidAccessError अपवाद को फेंकने के साथ प्रयोग कर सकता है। "
केन शार्प

46

दोनों उत्तर गलत हैं। आप ऐसा कर सकते हैं। आपको कॉल करने की आवश्यकता है

$.ajaxSetup({
async: false
});

अपने json अजाक्स कॉल से पहले। और आप कॉल रिटन के बाद इसे सही पर सेट कर सकते हैं (यदि पेज पर अजाक्स के अन्य उपयोग हैं तो आप उन्हें लाइक करें)


1
मैं केवल डॉक्स के उस हिस्से को फिर से पढ़ता हूं। यहाँ वह भाग है जो ajaxSetup के बारे में बात करता है: api.jquery.com/jQuery.ajaxSetup और यहाँ विकल्प हैं: api.jquery.com/jQuery.ajax यह स्पष्ट रूप से कहता है: "async डिफ़ॉल्ट: सच डिफ़ॉल्ट रूप से, सभी अनुरोध अतुल्यकालिक भेजे जाते हैं ( यानी यह डिफ़ॉल्ट रूप से सही पर सेट है)। यदि आपको सिंक्रोनस अनुरोधों की आवश्यकता है, तो इस विकल्प को गलत पर सेट करें। क्रॉस-डोमेन अनुरोध और डेटा टाइप करें: "jsonp" अनुरोध सिंक्रोनस ऑपरेशन का समर्थन नहीं करते हैं। "JSONP JSON नहीं है, इसलिए मैं अभी भी हूं। शुरुआत से ही सही। मैं बाद में उदाहरण लिखूंगा जब मुझे कुछ समय मिलेगा।
वेग

7
यह देर से टिप्पणी है लेकिन ... जो "दोनों" उत्तर गलत हैं? मुझे लगता है कि @Nick क्रैवर का उत्तर दोनों को स्वीकार्य है और वैश्विक AJAX सेटिंग्स के साथ "गड़बड़" नहीं होना चाहिए (अन्य अनुरोधों को उसी समय फायरिंग हो सकती है)
scunliffe

1
यह काम करता है, लेकिन यह लागू होता है कि पेज में आपके द्वारा किए गए सभी अजाक्स अनुरोधों के लिए। इसलिए मैं नीचे जाने की सिफारिश करता हूं क्योंकि मैं इसकी सिफारिश नहीं
करूंगा

3
यह एक बहुत ही कम गुणवत्ता वाला उत्तर है
ब्रायन वेबस्टर

1
-1: चीजों को समकालिक बनाना महंगा हो सकता है। आपको निश्चित रूप से प्रति कॉल के आधार पर ऐसा करना चाहिए जब तक कि आपकी परियोजना को हर बार इसकी आवश्यकता न हो। आपका जवाब पता चलता है कि आप विश्व स्तर पर सभी कॉल कॉन्फ़िगर $.ajax(और बाद में आशुलिपि रैपर यानी $.getJSON, $.getआदि) तुल्यकालिक किया जाना है। इसके अलावा, दस्तावेज़ीकरण भी इसका उपयोग नहीं करने का सुझाव देता है: "विवरण: भविष्य के अजाक्स अनुरोधों के लिए डिफ़ॉल्ट मान सेट करें। इसका उपयोग अनुशंसित नहीं है।"
कैरी केंडल

18

मुझे लगता है कि आप दोनों सही हैं। बाद में उत्तर ठीक काम करता है लेकिन इसका एक वैश्विक विकल्प सेट करना पसंद है इसलिए आपको निम्नलिखित कार्य करने होंगे:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

मेरे मामले में, जे डी सही है। मुझे कॉल करने से पहले इसे जोड़ना होगा।

$.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 सिर्फ एक आसान एपीआई में कॉल को लपेटता है, साथ ही साथ)।


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);
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.