2011-10-15 18 views
20

के साथ असाइनमेंट मेरे पास निम्न jQuery फ़ंक्शन है। मैं alert(); में दिखाए गए GUID मान को वापस करने का प्रयास कर रहा हूं चेतावनी ठीक काम करती है और मान पॉप्युलेट किया जाता है, हालांकि मैं इसे एक चर के लिए असाइन नहीं कर सकता और इसके मान को वापस नहीं कर सकता।जावास्क्रिप्ट एसिंक्रोनस रिटर्न वैल्यू/jQuery

आखिरकार मुझे अन्य कार्यों में GUID मान तक पहुंचने की आवश्यकता है, आदि। मैंने जो कुछ भी कोशिश की है वह केवल undefined के रूप में प्रदर्शित होती है।

मैं इस तरह कुछ करने के लिए करना चाहते हैं:

function trackPage(){ 
    var elqTracker = new jQuery.elq(459); 
    elqTracker.pageTrack({ 
     success: function() { 
      elqTracker.getGUID(function(guid) { 
       alert(guid); 
       var returnValue = guid; 
      }); 
     } 
    }); 
    return returnValue; 
} 

var someGuid = trackPage(); 
+2

'getGUID' एक असीमित कॉल है? – Anurag

+0

सुनिश्चित नहीं है .. यह अन्य जेएस से एक प्लगइन कॉल है (एक कॉल जिसे मैं संशोधित नहीं कर सकता) .. मैं मूल्य को अलर्ट कर सकता हूं .. और इसे एक नए चर को भी असाइन कर सकता हूं .. मुझे लगता है कि यह मान बाहर के बाहर हो सकता है फ़ंक्शन – patrick

+0

निश्चित रूप से उस स्थिति में असीमित लगता है। –

उत्तर

47

तो, यह सवाल पूछा गया है बार, और मुझे यकीन है कि है कि हर कोई (अपने आप को शामिल) tried this once हूँ: इसके बजाय आप trackPage में कॉलबैक पास करना चाहिए।

यह केवल एक असीमित कॉल की प्रकृति है, आप return मान के रूप में अपने परिणामों का उपयोग नहीं कर सकते हैं। Thats क्यों वे एक समारोह में गुजर रहे हैं जो कॉल का नतीजा मिलता है, वे return नहीं कर सकते हैं! यह भी ध्यान दें कि elqTracker.pageTrack() फ़ंक्शन कॉल तत्काल लौटाता है, इसलिए आपका returnValue बस undefined है।

अधिकांश लोग (dfsq का उत्तर देखें) एक पैरामीटर के रूप में कॉलबैक फ़ंक्शन पेश करके इस समस्या को हल करें। इस विधि को आजमाया गया है, और सही – हालांकि jQuery में $.Deferred है। अब है कि आपके trackPage() एक वस्तु है कि आप के लिए कॉलबैक संलग्न कर सकते हैं रिटर्न

function trackPage(){ 
    var elqTracker = new jQuery.elq(459), 
     dfd = $.Deferred(); 

    elqTracker.pageTrack({ 
     success: function() { 
      elqTracker.getGUID(function(guid) { 
       dfd.resolve(guid); 
      }); 
     } 
    }); 

    return dfd.promise(); 
} 

// example use: 
trackPage().done(function(guid) { 
    alert("Got GUID:" + guid); 
}); 

सूचना: यह आप अपने खुद के अतुल्यकालिक तर्क एक promise है जिसे आप के लिए कॉलबैक के किसी भी संख्या संलग्न कर सकते हैं यह सुनिश्चित करने के लिए अनुमति देता है? आपको उन्हें तुरंत संलग्न करने की ज़रूरत नहीं है।

var pageHit = trackPage().done(function(guid) { 
    alert("Page Hit GUID:" +guid); 
}); 

$("button").click(function() { 
    pageHit.done(function(guid) { 
     alert("Clicked on Page GUID:" + guid); 
    }); 
}); 

इसके अलावा, jQuery AJAX मॉड्यूल हमेशा वादों रिटर्न के रूप में अच्छी तरह से है, तो आपके सभी AJAX के सामान के लिए इंटरफेस है, तो आप अपने खुद के तर्क वापसी वादा बहुत समान होना चाहिए।


एक पक्ष नोट के रूप में: मैं बाहर बात करने के लिए है कि अपने var returnValue गलत "गुंजाइश" फिर भी था चाहते हैं। इसे trackPage फ़ंक्शन के बाहरी दायरे में घोषित करने की आवश्यकता थी। इस फिक्स के साथ भी, अवधारणा अभी भी काम नहीं करती है।

13

के बाद से आप अतुल्यकालिक जिस तरह से आप कोड (काम करने के लिए क्योंकि trackCode बदले में return returnValue; के क्षण से नहीं जा रहा है लिखने के लिए कोशिश कर रहे हैं फोन मान अभी तक परिभाषित नहीं किया गया है)। से अधिक एक लाख

function trackPage(callback) { 
    var elqTracker = new jQuery.elq(459); 
    elqTracker.pageTrack({ 
     success: function() { 
      elqTracker.getGUID(function(guid) { 
       alert(guid); 
       // Instead of this: var returnValue = guid; 
       // You should use your callback function 
       callback(guid); 
      }); 
     } 
    }); 
    return returnValue; 
} 

trackCode(function(guid) { 
    // perform some actions with guid 
}); 
संबंधित मुद्दे