জাভাস্ক্রিপ্টে কলব্যাক ফাংশন সম্পর্কে আরও ভাল ধারণা অর্জন করা


163

আমি একটি ফাংশনটিতে কলব্যাক হিসাবে অন্য ফাংশনে যাওয়ার এবং এটি কার্যকর করার বিষয়টি বুঝতে পারি, তবে এটি করার জন্য আমি সেরা প্রয়োগটি বুঝতে পারি না। আমি খুব মৌলিক উদাহরণ খুঁজছি, এর মতো:

var myCallBackExample = {
    myFirstFunction : function( param1, param2, callback ) {
        // Do something with param1 and param2.
        if ( arguments.length == 3 ) {
            // Execute callback function.
            // What is the "best" way to do this?
        }
    },
    mySecondFunction : function() {
        myFirstFunction( false, true, function() {
            // When this anonymous function is called, execute it.
        });
    }
};

মাই ফার্স্টফুনশনে, আমি যদি নতুন কলব্যাক () ফেরত দিই, তবে এটি কাজ করে এবং বেনামে ফাংশন কার্যকর করে, তবে এটি আমার কাছে সঠিক পদ্ধতির মতো বলে মনে হয় না।


কোন অর্থে সঠিক? সাধারণত ইভেন্ট হ্যান্ডলারের জন্য কলব্যাকগুলি ব্যবহৃত হয় - সর্বাধিক উল্লেখযোগ্যভাবে অ্যাজাক্স কলগুলি, যা অ্যাসিনক্রোনাস bas মূলত এমন জিনিস যেখানে আপনি জানেন না কখন একটি রিসোজন আসবে or
ক্লিটাস

2
উপায় দ্বারা আর্গুমেন্টগুলি অ্যারের মতো তবে অ্যারের নয়, সুতরাং আপনি আর্গুমেন্ট.লেন্থটি করতে পারবেন না তবে আপনি স্লাইস পদ্ধতি ব্যবহার করে এটিকে অ্যারেতে রূপান্তর করতে পারবেন ...
পল

1
@ পল, যদিও আপনি ঠিক বলেছেন যে argumentsঅ্যারে নয়, আপনি এখনও এর দৈর্ঘ্যটি উল্লেখ করতে পারেন arguments.length- চেষ্টা করে দেখুন। এই সম্পত্তিটি প্রকৃতপক্ষে পাস হওয়া আর্গুমেন্টগুলির সংখ্যাকে বোঝায়, এবং অগত্যা ফাংশনের স্বাক্ষরে পরামিতিগুলির সংখ্যা।
হটশট 309

উত্তর:


132

আপনি শুধু বলতে পারেন

callback();

আপনি callযদি thisকলব্যাকের মধ্যে মান সামঞ্জস্য করতে চান তবে পর্যায়ক্রমে আপনি পদ্ধতিটি ব্যবহার করতে পারেন ।

callback.call( newValueForThis);

ভিতরে ফাংশন thisযা কিছু newValueForThisহবে।


91

কলব্যাকের উপস্থিতি আছে কিনা তা আপনার পরীক্ষা করা উচিত এবং এটি একটি এক্সিকিউটেবল ফাংশন:

if (callback && typeof(callback) === "function") {
    // execute the callback, passing parameters as necessary
    callback();
}

প্রচুর গ্রন্থাগার (jQuery, dojo, ইত্যাদি) তাদের অ্যাসিনক্রোনাস ফাংশনগুলির জন্য একই রকম প্যাটার্ন ব্যবহার করে, পাশাপাশি সমস্ত async ফাংশনগুলির জন্য নোড.জেগুলি (নোডেজ সাধারণত পাস errorএবং dataকলব্যাকে যায়)। তাদের উত্স কোড অনুসন্ধান করা সাহায্য করবে!


আপনি কেন callbackস্ট্রিংয়ে কাস্ট করেন এবং তার প্রকারটি পরীক্ষা করেন? এটি কি কার্যকারিতা বাড়িয়ে তুলবে? এটি ধরণের পরীক্ষা করে দেখার মতো, রূপান্তরিত বুলেটিয়ান সত্যটি ফিরে আসে কিনা তা পরীক্ষা করে আবার তার ধরণটি পরীক্ষা করে স্ট্রিংয়ের বিপরীতে পরীক্ষা করে দেখার মতো ... আপনি কেন ব্যাখ্যা করতে পারেন?
মাথাব্যথা

আমি কৌতূহল যে কেন আপনি কলব্যাকের জন্য প্রথম দৃ as়তা প্রয়োজন ... এটি নাল বা অপরিজ্ঞাত পরীক্ষা করা কি? আপনার জন্য তা typeof(callback)অর্জন করবে না ? typeof(null) === "Object",typeof("undefined") === "undefined"
পিজেএইচ

1
শর্ট সার্কিট এবং। যদি কলব্যাকের অস্তিত্ব না থাকে তবে এর ধরণের গণনা করতে বিরক্ত করবেন না। যদিও, আপনি ঠিক বলেছেন। টাইপফোর () এর সাথে এটি প্রয়োজন হয় না, তবে আমি একটি জেএসপিআফ করব এবং শর্ট সার্কিটের পক্ষে এটির মূল্য রয়েছে কিনা তা দেখতে পাবো।
অরুনজিৎসিংহ

@ HeadacheCoder - callbackকোনও স্ট্রিংয়ে কাস্ট করা হচ্ছে না, এটির ডাকার আগে টাইপটি এটি কোনও ফাংশন কিনা তা পরীক্ষা করে দেখা হচ্ছে। কোড সম্ভবত callbackযুক্তি হিসাবে গ্রহণ করে , এবং অনিশ্চিত যে আর্গুমেন্টটি কলযোগ্য ধরণের - বা সম্ভবত যুক্তিগুলি বহুবৈচিত্র্যের একটি ফর্ম সরবরাহ করার প্রয়াসে বিভিন্ন ধরণের যেখানে কোডটি বিভিন্ন typeofযুক্তির সাথে আলাদাভাবে প্রতিক্রিয়া দেখাতে পারে ।
লিগি

34

একটি কার্য সম্পাদন করার জন্য 3 টি প্রধান সম্ভাবনা রয়েছে:

var callback = function(x, y) {
    // "this" may be different depending how you call the function
    alert(this);
};
  1. কলব্যাক (যুক্তি_, যুক্তি_২);
  2. কলব্যাক.এল কল (কিছু_বজেক্ট, যুক্তি_, আর্গুমেন্ট_2)
  3. কলব্যাক.অ্যাপ্লি (কিছু_বজেক্ট, [যুক্তি_, আর্গুমেন্ট_2]);

আপনি যে পদ্ধতিটি চয়ন করছেন তা নির্ভর করে:

  1. আপনার কাছে একটি অ্যারে বা স্বতন্ত্র ভেরিয়েবল হিসাবে যুক্তি রয়েছে stored
  2. আপনি কিছু বস্তুর প্রসঙ্গে সেই ফাংশনটি কল করতে চান। এই ক্ষেত্রে, এই কলব্যাকটিতে "এই" কীওয়ার্ডটি ব্যবহার করা কলটিকে () বা প্রয়োগ () প্রয়োগ করে আর্গুমেন্ট হিসাবে পাস হওয়া বিষয়টিকে উল্লেখ করবে। আপনি যদি অবজেক্টের প্রসঙ্গটি পাস করতে না চান তবে নাল বা অপরিজ্ঞাত ব্যবহার করুন। পরবর্তী ক্ষেত্রে গ্লোবাল অবজেক্টটি "এটি" এর জন্য ব্যবহৃত হত।

Function.call , Function.apply এর জন্য দস্তাবেজ


6

কলব্যাকস সিগন্যাল সম্পর্কে এবং "নতুন" অবজেক্টের উদাহরণ তৈরি করার বিষয়ে।

এই ক্ষেত্রে কেবল "কলব্যাক ()" চালানো আরও বেশি উপযুক্ত হবে; "রিটার্ন নিউ কলব্যাক ()" এর চেয়ে বেশি কারণ আপনি যেভাবে কোনও রিটার্ন মান দিয়ে কিছুই করছেন না।

(এবং আর্গুমেন্টস দৈর্ঘ্য == 3 পরীক্ষাটি সত্যিই চতুর, আরও ভাল, কলব্যাকের পরম উপস্থিত রয়েছে তা যাচাই করা আরও ভাল এবং এটি একটি ফাংশন))


6

সঠিক বাস্তবায়ন হবে:

if( callback ) callback();

এটি কলব্যাকের প্যারামিটারটিকে alচ্ছিক করে তোলে ..


কলব্যাক আর্গুমেন্ট কোনও ফাংশন না হলে কী হবে?
ইয়াকি ক্লিন

2

তুমি ব্যবহার করতে পার:

if (callback && typeof(callback) === "function") {
    callback();
}

নীচের উদাহরণটি আরও কিছুটা বিস্তৃত:

function mySandwich(param1, param2, callback) {
  alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);
  var sandwich = {
      toppings: [param1, param2]
    },
    madeCorrectly = (typeof(param1) === "string" && typeof(param2) === "string") ? true : false;
  if (callback && typeof(callback) === "function") {
    callback.apply(sandwich, [madeCorrectly]);
  }
}

mySandwich('ham', 'cheese', function(correct) {
  if (correct) {
    alert("Finished eating my " + this.toppings[0] + " and " + this.toppings[1] + " sandwich.");
  } else {
    alert("Gross!  Why would I eat a " + this.toppings[0] + " and " + this.toppings[1] + " sandwich?");
  }
});


1

এখানে একটি প্রাথমিক উদাহরণ যা callback()জাভাস্ক্রিপ্টে ফাংশনটি ব্যাখ্যা করে:

var x = 0;

function testCallBack(param1, param2, callback) {
  alert('param1= ' + param1 + ', param2= ' + param2 + ' X=' + x);
  if (callback && typeof(callback) === "function") {
    x += 1;
    alert("Calla Back x= " + x);
    x += 1;
    callback();
  }
}

testCallBack('ham', 'cheese', function() {
  alert("Function X= " + x);
});

JSFiddle


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.