2013-02-07 19 views
70

मैं jQuery ajax उपयोग करने के लिए एक सर्वर से डेटा प्राप्त करना चाहते हैं।jQuery ajax सफलता कॉलबैक फ़ंक्शन परिभाषा

मैं निम्नलिखित की तरह .ajax() ब्लॉक के बाहर सफलता कॉलबैक फ़ंक्शन परिभाषा रखना चाहता हूं। तो मैं निम्नलिखित की तरह चर dataFromServer घोषित करने के लिए इतना है कि मैं सफलता कॉलबैक से लौटे डेटा का उपयोग करने में सक्षम हो जाएगा की जरूरत है?

मैंने देखा है कि ज्यादातर लोगों को .ajax() ब्लॉक के अंदर सफलता कॉलबैक परिभाषित करते हैं। तो निम्नलिखित कोड सही अगर मैं बाहर सफलता कॉलबैक को परिभाषित करना चाहते है?

var dataFromServer; //declare the variable first 

function getData() { 
    $.ajax({ 
     url : 'example.com', 
     type: 'GET', 
     success : handleData(dataFromServer) 
    }) 
} 

function handleData(data) { 
    alert(data); 
    //do some stuff 
} 

उत्तर

73

बस का उपयोग करें:

function getData() { 
    $.ajax({ 
     url : 'example.com', 
     type: 'GET', 
     success : handleData 
    }) 
} 

success संपत्ति एक समारोह के लिए केवल एक संदर्भ की आवश्यकता है, और यह कार्य करने के लिए पैरामीटर के रूप में डेटा गुजरता है।

handleData की घोषणा के कारण आप इस तरह के handleData फ़ंक्शन को एक्सेस कर सकते हैं। जावास्क्रिप्ट चलाने से पहले समारोह घोषणाओं के लिए अपने कोड को पार्स होगा, ताकि आप वास्तविक घोषणा से पहले का कोई कोड में फ़ंक्शन का उपयोग कर सकेंगे। यह hoisting के रूप में जाना जाता है।

यह हालांकि, इस तरह के कार्यों की घोषणा के लिए गिनती नहीं करता है:

var myfunction = function(){} 

उन ही उपलब्ध रहती हैं दुभाषिया उन्हें पारित कर दिया।

See this question for more information about the 2 ways of declaring functions

+3

गुजर 'success' कॉलबैक 2010 _so_ ... – Alnitak

+0

@Alnitak, जब' टाल objects' बात परिचित होने के किया है? मैंने इसे पहले नहीं देखा है। साथ ही, यह थोड़ा गन्दा लगता है, क्योंकि कोड जो परिभाषित करता है कि कौन सी कॉलबैक उपयोग करने के लिए वास्तविक AJAX कॉल की तुलना में एक अलग स्थान पर है। – Cerbrus

+3

इसे jQuery 1.5 में पेश किया गया था और यह 'सफलता:' का उपयोग करने से _far_ कम गन्दा है। AJAX से कॉलबैक decoupling एक _good_ बात है! नोट्स देखें जो मैंने अभी अपने उत्तर के अंत में जोड़े हैं। – Alnitak

5

को अपनी सफलता हैंडलर को फिर से लिखने का प्रयास करें:

success : handleData 

ajax विधि की सफलता संपत्ति केवल एक समारोह के लिए एक संदर्भ की आवश्यकता है।

अपने handleData में कार्य करते हैं आप 3 मानकों तक लग सकते हैं:

object data 
string textStatus 
jqXHR jqXHR 
3

मैं लिखने होगा:

var dataFromServer; //declare the variable first 

var handleData = function (data) { 
    alert(data); 
    //do some stuff 
} 


function getData() { 
    $.ajax({ 
     url : 'example.com', 
     type: 'GET', 
     success : handleData 
    }) 
} 
+13

आपका कोड वास्तव में 'dataFromServer' का उपयोग नहीं करता है ताकि पहली पंक्ति को हटाया जा सके। –

1

आप चर घोषित करने के लिए जरूरत नहीं है। Function(Object data, String textStatus, jqXHR jqXHR)

163

'नई' jQuery 1.5 (जनवरी 2011) के बाद से ऐसा करने का तरीका बजाय एक success कॉलबैक पास करने का आस्थगित वस्तुओं का उपयोग करने के लिए है: अजाक्स सफलता समारोह स्वचालित रूप से 3 मानकों तक लगते हैं। आप $.ajax का परिणाम लौटना चाहिए और उसके बाद कॉलबैक $.ajax कॉल की बाहर जोड़ने के लिए .done, .fail आदि विधियों का उपयोग करें।

function getData() { 
    return $.ajax({ 
     url : 'example.com', 
     type: 'GET' 
    }); 
} 

function handleData(data /* , textStatus, jqXHR */) { 
    alert(data); 
    //do some stuff 
} 

getData().done(handleData); 

यह अलग करता कॉलबैक AJAX से निपटने से निपटने, तुम सब कभी मूल getData() समारोह को संशोधित करने की जरूरत के बिना, कई कॉलबैक, विफलता कॉलबैक, आदि को जोड़ने के लिए अनुमति देता है।क्रियाओं के सेट से AJAX कार्यक्षमता को अलग करने के बाद अच्छी बात है!

Deferreds भी कई अतुल्यकालिक घटनाओं, जो आप आसानी से बस के साथ success:

ऐसा नहीं कर सकते उदाहरण के लिए, मैं कई कॉलबैक, एक त्रुटि हैंडलर जोड़ सकता है की बहुत आसान तुल्यकालन के लिए अनुमति देते हैं, और एक टाइमर बीतने वाले के लिए प्रतीक्षा पहले जारी:

// a trivial timer, just for demo purposes - 
// it resolves itself after 5 seconds 
var timer = $.Deferred(); 
setTimeout(timer.resolve, 5000); 

// add a done handler _and_ an `error:` handler, even though `getData` 
// didn't directly expose that functionality 
var ajax = getData().done(handleData).fail(error); 

$.when(timer, ajax).done(function() { 
    // this won't be called until *both* the AJAX and the 5s timer have finished 
}); 

ajax.done(function(data) { 
    // you can add additional callbacks too, even if the AJAX call 
    // already finished 
}); 

jQuery के अन्य हिस्सों आस्थगित वस्तुओं का उपयोग भी - यदि आप अन्य async संचालन के साथ jQuery एनिमेशन बहुत आसानी से उन लोगों के साथ सिंक्रनाइज़ कर सकते हैं।

+1

@Cerbrus नया उदाहरण देखें, और उसके बाद विचार करें कि आप इसे कैसे करेंगे _without_ स्थगित ऑब्जेक्ट्स – Alnitak

+0

@jbl स्थगित ऑब्जेक्ट शानदार हैं। मैं _normally_ किसी भी उत्तर को कम करता हूं जो 'सफलता:' के उपयोग को बढ़ावा देता है क्योंकि स्थगित बस इतना बेहतर काम करते हैं। – Alnitak

+0

@ सेर्ब्रस यह बिल्कुल ठीक है कि इसका अर्थ कैसे समझा जाना चाहिए। सुझाव दें कि आप _lots_ और उदाहरणों के लिए 'उपयोगकर्ता: 6782 स्थगित' के लिए यहां खोजें। – Alnitak

11

मुझे नहीं पता कि आप स्क्रिप्ट के बाहर पैरामीटर को क्यों परिभाषित कर रहे हैं। यह अनावश्यक है। आपके कॉलबैक फ़ंक्शन को रिटर्न डेटा के साथ स्वचालित रूप से पैरामीटर के रूप में बुलाया जाएगा। यह sucess: अर्थात

function getData() { 
    $.ajax({ 
     url : 'example.com', 
     type: 'GET', 
     success : handleData 
    }) 
} 

function handleData(data) { 
    alert(data); 
    //do some stuff 
} 

handleData फ़ंक्शन कॉल किया जाएगा और पैरामीटर ajax समारोह द्वारा इसे पारित कर दिया बाहर अपने कॉलबैक परिभाषित करने के लिए बहुत संभव है।

1

कुछ घंटों के बाद इसके साथ खेलते हैं और लगभग सुस्त हो जाते हैं। चमत्कार मेरे पास आया, यह काम करता है।

<pre> 


var listname = []; 


$.ajax({ 
    url : wedding, // change to your local url, this not work with absolute url 
    success: function (data) { 
     callback(data); 
    } 
}); 

function callback(data) { 
     $(data).find("a").attr("href", function (i, val) { 
      if(val.match(/\.(jpe?g|png|gif)$/)) { 
      // $('#displayImage1').append("<img src='" + wedding + val +"'>"); 
       listname.push(val); 
      } 
     }); 
} 

function myfunction() { 

alert (listname); 

} 

</pre> 
+0

आपको सफलता के लिए एक और फ़ंक्शन कॉल करने की आवश्यकता नहीं है । आप सीधे कह सकते हैं 'सफलता: कॉलबैक' jquery 'फ़ंक्शन' पैरामीटर के साथ 'कॉलबैक' नामक आपके फ़ंक्शन को ट्रिगर करेगा। –

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