jQuery के अजाक्स सफलता कॉलबैक फ़ंक्शन परिभाषा


90

मैं एक सर्वर से डेटा को पुनः प्राप्त करने के लिए 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
}

जवाबों:


93

महज प्रयोग करें:

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

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

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

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

var myfunction = function(){}

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

कार्यों को घोषित करने के 2 तरीकों के बारे में अधिक जानकारी के लिए यह प्रश्न देखें


1
@ अलनीतक, deferred objectsबात कब शुरू हुई? मैंने इसे पहले नहीं देखा है। इसके अलावा, यह थोड़ा गड़बड़ लगता है, क्योंकि कोड जो कि कॉलबैक का उपयोग करने को परिभाषित करता है, वास्तविक AJAX कॉल की तुलना में एक अलग स्थान पर है।
सेरेब्रस

4
इसे jQuery 1.5 में पेश किया गया था और यह उपयोग करने की तुलना में बहुत कम गन्दा है success:। AJAX से कॉलबैक की घोषणा करना अच्छी बात है! मेरे उत्तर के अंत में मेरे द्वारा जोड़े गए नोट्स देखें।
अलनीतक

@Alnitak, मेरी नज़र होगी। आइए देखें कि क्या मैं आश्वस्त हो सकता हूं: पी
सेरेब्रस

@Alnitak: क्या आस्थगित वस्तुओं को हमेशा सफलता कॉलबैक के ऊपर पसंद किया जाता है? धन्यवाद।
टोंगा

@ टोंगा IMHO, हाँ, बहुत पसंद किया गया। यदि आपका कोड $.get()उदाहरण के लिए उपयोग कर रहा है, तो error:हैंडलर को जोड़ना असंभव होगा क्योंकि $.getयह समर्थन नहीं करता है। हालाँकि आप के आस्थगित परिणाम में जोड़ सकते हैं । .fail$.get
अलनीतक

199

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

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 नया उदाहरण देखें, और फिर विचार करें कि आप इसे बिना आस्थगित वस्तुओं के कैसे करेंगे
Alnitak

@jbl आस्थगित वस्तुएं शानदार हैं। मैं आम तौर पर किसी भी उत्तर को अस्वीकार कर देता हूं जो कि उपयोग को बढ़ावा देता है success:क्योंकि deferreds सिर्फ इतना बेहतर काम करते हैं।
अलनीतक

@Cerbrus ठीक इसी तरह से इसकी व्याख्या की जानी चाहिए। सुझाव है कि आप यहाँ के लिए खोज user:6782 deferredके लिए बहुत सारे और उदाहरण।
अलनीतक Al

फ़ॉर्म सबमिट ईवेंट के साथ कोई इसका उपयोग कैसे कर सकता है?
जेक

alertहालांकि वह ... मैं व्यक्तिगत रूप से उपयोग करूंगा console.log(data)या अगर यह एक सरणी है: console.table(data):)
आर्मस्ट्रांगेस्ट

16

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

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

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

हैंडलडाटा फ़ंक्शन को कॉल किया जाएगा और अजाक्स फ़ंक्शन द्वारा इसे पास किया गया पैरामीटर।


6

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

success : handleData

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

अपने हैंडलडैट फ़ंक्शन में आप 3 पैरामीटर ले सकते हैं:

object data
string textStatus
jqXHR jqXHR

5

मैं लिखूंगा :

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


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

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

2

आपको चर घोषित करने की आवश्यकता नहीं है। Ajax सफलता समारोह स्वचालित रूप से 3 मापदंडों तक ले जाता है:Function( Object data, String textStatus, jqXHR jqXHR )


उन डिफ़ॉल्ट मापदंडों को खोजने के लिए किसी तरह थोड़ी देर देखना पड़ा। धन्यवाद!
payne

2

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

<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>

1
आपको सफलता के लिए दूसरा फ़ंक्शन कॉल करने की आवश्यकता नहीं है। आप सीधे कह सकते हैं कि success : callbackjquery आपके कार्य को उसमें पैरामीटर के callbackसाथ बुलाया जाएगा data
ओलगुन काया

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