jQuery আজাক্স সাফল্য কলব্যাক ফাংশন সংজ্ঞা


90

আমি একটি সার্ভার থেকে ডেটা পুনরুদ্ধার করতে jQuery আজাক্স ব্যবহার করতে চাই।

আমি .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 উপায় সম্পর্কে আরও তথ্যের জন্য এই প্রশ্নটি দেখুন


4
@ অলনিটক, কখন deferred objectsবিষয়টি প্রকাশিত হয়েছে? আমি এর আগে দেখিনি। এছাড়াও, এটি কিছুটা অগোছালো বলে মনে হচ্ছে, যে কোডটি কী কলব্যাকটি ব্যবহার করবে তা সংজ্ঞায়িত করে প্রকৃত এজেএক্স কলের চেয়ে পৃথক স্থানে।
সার্বারবস

4
এটি jQuery 1.5 চালু হয় এবং এটি পর্যন্ত ব্যবহার কম নোংরা success:। এজেএক্স থেকে কলব্যাক ডিকোপল করা ভাল জিনিস! আমার উত্তরের শেষে আমি যে নোটগুলি জুড়েছি তা দেখুন।
Alnitak

@ অলনিটক, আমার একবার দেখা হবে। আসুন দেখুন আমি নিশ্চিত হতে পারি কিনা: পি
সার্বারাস

@ অ্যালনিটাক: স্থগিত বস্তুগুলি কি সর্বদা সাফল্য কলব্যাকের চেয়ে বেশি পছন্দ করা হয়? ধন্যবাদ
টঙ্গা

@ টঙ্গা আইএমএইচও, হ্যাঁ, খুব পছন্দসই। যদি আপনার কোড $.get()উদাহরণস্বরূপ ব্যবহার করা থাকে তবে কোনও error:হ্যান্ডলার যুক্ত করা অসম্ভব হত কারণ $.getএটি সমর্থন করে না। তবে আপনি করতে পারেন একটি যোগ .failডেফার্ড করতে ফলাফলের এর $.get
Alnitak

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

এটি আজাক্স হ্যান্ডলিং থেকে কলব্যাক হ্যান্ডলিংকে ডিউপল করে, আপনাকে মূল getData()ফাংশনটি পরিবর্তন করার প্রয়োজন ছাড়াই একাধিক কলব্যাকস, ব্যর্থতা কলব্যাকস, ইত্যাদি যোগ করতে দেয় । কাজগুলির সেটটি পরে শেষ হওয়ার পরে এজেএক্স কার্যকারিতা পৃথক করা ভাল জিনিস!

ডিফার্ডগুলি একাধিক অ্যাসিনক্রোনাস ইভেন্টগুলির অনেক সহজ সিঙ্ক্রোনাইজেশনের জন্যও মঞ্জুরি দেয়, যা আপনি সহজেই কেবল এর মাধ্যমে করতে পারবেন না 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 এর অন্যান্য অংশগুলি মুলতুবি বস্তু ব্যবহার করে - আপনি jQuery অ্যানিমেশনগুলিকে খুব সহজেই অন্যান্য async ক্রিয়াকলাপগুলির সাথে তাদের সাথে সিঙ্ক্রোনাইজ করতে পারেন।


4
@ সার্বরাস নতুন উদাহরণটি দেখুন, এবং তারপরে বিবেচনা করুন কীভাবে আপনি পিছিয়ে থাকা বস্তুগুলি ছাড়াই এটি করবেন
আলনিটাক

@jbl মুলতুবি বস্তু চমত্কার। আমি সাধারণত যে কোনও উত্তর ব্যবহারকে উত্সাহিত করে তা ডাউনভোট করি success:কারণ ডিফার্ডরা কেবল আরও ভালভাবে কাজ করে।
Alnitak

@ সার্বরাস ঠিক এটির ব্যাখ্যা করার কথা। সুপারিশ আপনি এখানে অনুসন্ধান user:6782 deferredজন্য প্রচুর আরো উদাহরণ।
Alnitak

ফর্ম জমা দেওয়ার ইভেন্টের মাধ্যমে কেউ কীভাবে এটি ব্যবহার করতে পারে?
হাকিম

যে alertযদিও ... আমি ব্যক্তিগতভাবে ব্যবহার করতে চাই console.log(data)বা যদি এটি একটি অ্যারের দেওয়া হল: console.table(data):)
Armstrongest

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

আপনার ভেরিয়েবলটি ঘোষণা করার দরকার নেই। অ্যাজাক্স সাফল্যের ফাংশনটি স্বয়ংক্রিয়ভাবে 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>

4
সাফল্যের জন্য আপনাকে আর একটি ফাংশন কল করার দরকার নেই। আপনি সরাসরি বলতে পারেন success : callbackjquery callbackএতে dataপ্যারামিটার দিয়ে ডাকা আপনার ফাংশনটিকে ট্রিগার করবে।
ওলগুন কেয়া

-1

আপনার উপাদান যেমন কৌণিক জেএস কোড:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.