2013-11-26 3 views
7

एक ऐप में मैं बना रहा हूं मेरे पास नीचे XMLHttpRequest है और मैं data के xhr.onload() के परिणामों को उसी सरणी फ़ंक्शन में बनाए गए सरणी में पास करने का प्रयास कर रहा हूं।वैश्विक स्तर पर एक xhr ऑनलोड फ़ंक्शन का मान पास करें

var url = 'http://api.soundcloud.com/resolve.json?'+resource+'&'+CLIENT_ID; 
var xhr = new XMLHttpRequest(); 
xhr.open('GET', url, true); 
xhr.onload = function(){ 
    var data = JSON.parse(xhr.responseText); 
    console.log(data.permalink_url); 
}; 
xhr.send(); 

इसके नीचे मैं एक सरणी के निर्माण ब्लॉक है और मैं ट्रैक स्ट्रिंग में डेटा के परिणामों पारित करने के लिए कोशिश कर रहा हूँ।

var metadata = { 
     id: val, 
     title: title, 
     url: posturl, 
     track: data.permalink_url 
     }; 

सब कुछ मैं अब तक की कोशिश की है या तो रिटर्न undefined या function और अब मैं विचारों से बाहर पूरी तरह से कर रहा हूँ ...

+0

'मेटाडाटा' कहां उपयोग किया जाता है? –

+0

सीधे इसके नीचे, फ़ंक्शन के एक अलग संस्करण के साथ एक पहेली है http://jsfiddle.net/4eY6b/ - शीर्षक ठीक काम करता है। – leaksterrr

उत्तर

5

अजाक्स एसिंक्रोनस रूप से निष्पादित (आम तौर पर)। अजाक्स कैसे काम करता है यह महत्वपूर्ण है। क्या इसका मतलब यह है कि आप जबonload विधि को सक्रिय कर देगा पर भरोसा नहीं कर सकते हैं, या यहाँ तक अगर यह आग जाएगा। इसका अर्थ यह है कि xhr.responseText (HTTP अनुरोध का परिणाम) पर निर्भर करता है कि सभी कोड कॉलबैक के भीतर ही किया जाना चाहिए। उदाहरण के लिए:

xhr.onload = function() { 
    // This will execute second 
    doStuffWithData(JSON.parse(xhr.responseText)); 
} 
// This will execute first 
xhr.send(); 
var anything = anythingElse; 
0

जैसे कि मैंने my previous answer टिप्पणी में कहा, आप एक पंक्ति xhr.open('GET', url, false) को बदल सकते हैं। यह अनुरोध तुल्यकालिक बना देगा और अनुरोध पूरा होने तक बाकी सब कुछ चलने से रोक देगा। यह आपको ऑनलोड फ़ंक्शन की प्रतीक्षा किए बिना xhr.responseText तक पहुंचने की अनुमति देगा।

CLIENT_ID = 'client_id=xxx'; 
var src = track, 
    match = src.match(/url=([^&]*)/), 
    resource = match[0], 
    stream = decodeURIComponent(match[1]) + '/stream/?' + '&' + CLIENT_ID; 

var url = 'http://api.soundcloud.com/resolve.json?' + resource + '&' + CLIENT_ID; 
var xhr = new XMLHttpRequest(); 
xhr.open('GET', url, false); 
xhr.send(); 

parsedResults.push({ 
    title: title, 
    track: JSON.parse(xhr.responseText) 
}); 

आप see it in action here कर सकते हैं। ऐसा लगता है कि क्रोम में किसी कारण से टूटा हुआ प्रतीत होता है। हालांकि फ़ायरफ़ॉक्स में काम करता है। मुझे लगता है कि यह CORS + 302 रीडायरेक्ट + सिंक्रोनस अनुरोध के साथ कुछ करने के लिए है।

0

मैं विस्फोट गोलियों के समाधान के लिए गया हूं। मुझे सामना करने वाली एकमात्र समस्या यह है कि क्रॉल किए जाने वाले लिंक हमेशा नोड ऐप चलाने पर एक ही क्रम में वापस नहीं आते हैं। वास्तव में उन्हें इस क्रम में वापस लौटना चाहिए कि वे क्रॉल किए गए हैं (जो सबसे पहले पोस्ट होंगे, है ना?) हालांकि यह हमेशा ऐसा नहीं होता है?

संबंधित मुद्दे