2011-03-19 22 views
12

मैं जावास्क्रिप्ट प्रोग्रामिंग के लिए नया हूँ। अब मैं अपने Google क्रोम एक्सटेंशन पर काम कर रहा हूं। यह वह कोड है जो काम नहीं करता है ...: पीमैं XHR.onreadystatechange कैसे अपना परिणाम वापस कर सकता हूं?

मैं getURLInfo फ़ंक्शन को अपने JSON ऑब्जेक्ट को वापस करने के लिए चाहता हूं, और इसे resp में रखना चाहता हूं। क्या कोई इसे काम करने के लिए कृपया अपना कोड ठीक कर सकता है?

अग्रिम धन्यवाद।

उत्तर

21

आप एक अतुल्यकालिक समारोह कॉल यहाँ के साथ काम कर रहे हैं। परिणाम तब पहुंचते हैं जब वे पहुंचते हैं, न कि फ़ंक्शन चलने पर।

यही कॉलबैक फ़ंक्शन हैं। परिणाम उपलब्ध होने पर उन्हें बुलाया जाता है।

function get(url, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url, true); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4) { 
      // defensive check 
      if (typeof callback === "function") { 
       // apply() sets the meaning of "this" in the callback 
       callback.apply(xhr); 
      } 
     } 
    }; 
    xhr.send(); 
} 
// ---------------------------------------------------------------------------- 


var param = "http://example.com/";     /* do NOT use escape() */ 
var finalUrl = "http://RESTfulAPI/info.json?url=" + encodeURIComponent(param); 

// get() completes immediately... 
get(finalUrl, 
    // ...however, this callback is invoked AFTER the response arrives 
    function() { 
     // "this" is the XHR object here! 
     var resp = JSON.parse(this.responseText); 

     // now do something with resp 
     alert(resp); 
    } 
); 

नोट्स:

  • escape() हमेशा के लिए के बाद से मान्य नहीं है। इसका उपयोग न करें, यह सही तरीके से काम नहीं करता है। encodeURIComponent() का प्रयोग करें।
  • आप send() कॉल तुल्यकालिक कर सकता है, false को open() की async पैरामीटर की स्थापना करके। अनुरोध के चलते यह आपके यूआई फ्रीजिंग के परिणामस्वरूप होगा, और आप इसे नहीं चाहते हैं।
  • कई पुस्तकालय हैं जिन्हें अजाक्स अनुरोधों को आसान और बहुमुखी बनाने के लिए डिज़ाइन किया गया है। मैं उनमें से एक का उपयोग करने का सुझाव देते हैं।
3

आप एसिंक्रोनस एक्सएचआर कॉल के लिए बिल्कुल ऐसा नहीं कर सकते हैं। आप सर्वर से HTTP प्रतिक्रिया के लिए जावास्क्रिप्ट "प्रतीक्षा" नहीं कर सकते हैं; आप जो भी कर सकते हैं वह रनटाइम सिस्टम को कॉल करने के लिए एक फ़ंक्शन (आपका हैंडलर) है, और यह इसे कॉल करेगा। हालांकि, यह कॉल XHR सेट अप करने वाले कोड के बाद लंबे समय पर आ जाएगा।

सभी खो नहीं गए हैं, हालांकि, हैंडलर फ़ंक्शन कुछ भी कर सकता है। जो कुछ भी है वह आप रिटर्न वैल्यू के साथ करना चाहते हैं, आप हैंडलर (या हैंडलर के अंदर से जुड़े अन्य कार्यों से) के अंदर कर सकते हैं।

इस प्रकार अपने उदाहरण में, तो आप इस तरह बातें बदल देंगे:

xhr.onreadystatechange = function() 
    { 
     if (xhr.readyState == 4) 
     { 
      var resp = JSON.parse(xhr.responseText); 
      // 
      // ... whatever you need to do with "resp" ... 
      // 
     } 
    } 
} 
-1
छोटे संपादित पोस्ट के बारे में बात करने के लिए

: https://stackoverflow.com/a/5362513/4766489

... 
if (typeof callback == "function") { 
    //var resp = xhr.responseText; 
    var resp = JSON.parse(xhr.responseText); 
    callback(resp); 
} 
... 

और जब आप फोन

... 
function(data) { 
    alert(data); 
    /* now do something with resp */ 
} 
... 
संबंधित मुद्दे