বিলম্বিত কলব্যাক কি?


15

আমি কলব্যাকের ধারণাটি বুঝতে পারি, যেখানে আমি কোনও ফাংশনটিকে অন্য ফাংশনে পাস করি এবং সেই ফাংশনটি পরে ইচ্ছামত সরবরাহ করা ফাংশনটি ব্যবহার করে।

আমি স্থগিত কলব্যাকগুলি গুগল করার পরেও বুঝতে লড়াই করছি।

কেউ দয়া করে একটি সহজ ব্যাখ্যা দিতে পারে? আমি রুবিতে প্রোগ্রাম করি, তবে সি / সি +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++> know সুতরাং আমি ভাবছি যে এটি কিছুটা কলব্যাক ঠিকানাগুলির স্ট্যাকের মতো যা পপড হয়ে যায়? আমি jquery বা নোড.জেএস শিখতে আশা করছি এবং এই পিছনে কলব্যাকগুলি উভয়েরই জন্য অবিচ্ছেদ্য বলে মনে হচ্ছে। আমি বুনিয়াদি থ্রেডিং নীতিগুলি বুঝতে পারি (যদিও মিটেক্স বস্তুটি আমার মাথাকে আঘাত করে;)


আপনি কি jQuery এর Deferredঅবজেক্ট বোঝাতে চান ? এটি কি নোড.জেএস-এর নির্দিষ্ট কিছু সম্পর্কে?
bfavareto

1
না আমি সাধারণভাবে বলতে চাইছি না। যদিও আমি jquery এবং সম্ভবত node.js শিখতে চাই, আমি অনুভব করেছি যে মুলতুবি কলব্যাক আসলে প্রথমে কী তা নিয়ে আমার একটি হ্যান্ডেল পাওয়া দরকার। আমি কলব্যাকগুলিতে উইকিপিডিয়া নিবন্ধটি পড়েছি, তবে আমি পিছিয়ে থাকা কলব্যাকগুলির একটি উপলব্ধি বুঝতে পারিনি, যা অ্যাসিঙ্ক্রোনাস অপারেশনের দৃষ্টান্তের সাথে অন্তর্নিহিত বলে মনে হয় যা এই ভাষাগুলি ব্যবহার করবে।


1
তাদের বাস্তবায়নের বিরোধী হিসাবে আমি সত্যিই পিছিয়ে কলব্যাকের ধারণামূলক ধারণাটি জিজ্ঞাসা করছি - দুঃখিত আমি যদি আরও পরিষ্কার না করি তবে। আমি যে ধারণাটি স্পষ্ট করার চেষ্টা করছি এবং আমার প্রোগ্রামিং ব্যাকগ্রাউন্ডটিও বোঝাতে আমি আরও ভাষা উদাহরণ দিয়েছি যাতে লোকেরা উত্তরটি কীভাবে আঁকতে হয় তা জানতে পারে। এখন পর্যন্ত উত্তরের জন্য অনেক ধন্যবাদ - আমি সেখানে পাচ্ছি!
দশম

ঠিক আছে আমি মনে করি আমি এখন এটি পেয়েছি, আপনারা সবাইকে ধন্যবাদ! উত্তরটি কীভাবে করতে হবে তা আমি জানি না। ক্যামেরন এই ধারণাটি সবচেয়ে সহজভাবে ব্যাখ্যা করেছিলেন এবং এটিই ছিল আমি সত্যই পরে, তবে অন্যরাও আমার জ্ঞানকে ঘৃণা করেছিল এবং যুক্ত করেছিল। আমি
এটির ক্ষেত্রে

উত্তর:


4

অনুরোধের দ্বারা, এখানে উত্তর হিসাবে মন্তব্যগুলি উপস্থাপন করা হয়েছে:


আমি নিশ্চিত নই যে আপনি জেএসে ফাংশনগুলি প্রথম শ্রেণীর অবজেক্টস হিসাবে সম্পূর্ণরূপে ছাঁটাই করেছেন এবং এটি তৈরি হওয়ার সময় অতীতে প্রয়োজন অনুযায়ী সংরক্ষণ করা যেতে পারে।

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

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

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

অন্তর্নিহিত সিস্টেমটি ইভেন্ট-চালিত তা স্থগিত কলব্যাকগুলির ব্যবহারের জন্য অরথোগোনাল; আপনি নোড.জেএস এর এমন একটি (খুব ধীর) সংস্করণটি কল্পনা করতে পারেন যা প্রতিটি ক্রিয়াকলাপের জন্য একটি থ্রেড শুরু করেছিল এবং তার পরে থ্রেডটি কোনও কাজ না করেই থ্রেডটির কাজ শেষ হলে আপনার প্রদত্ত কলব্যাক বলে called অবশ্যই, এটি একটি ভয়াবহ মডেল, তবে এটি আমার বিষয়টি তুলে ধরে :-)


8

স্থগিত কলব্যাকটি যেভাবে কাজ করে তা হ'ল প্রতিটি সময় আপনি এতে একটি কলব্যাক যুক্ত করেন, সেই কলব্যাকটি একটি অ্যারেতে ঠেলে দেওয়া হয়। তারপরে, যখন স্থিত বস্তুতে .resolve()বা .resolveWith()পদ্ধতিটি কল করা হয়, .done()অ্যারেতে সমস্ত কলব্যাকগুলি ক্রমে কার্যকর করা হয়।

একটি ডিফার্ড অবজেক্ট কী তা এখন আমরা দেখতে পারি। উদাহরণ হিসাবে নীচে স্নিপেট নিন।

var deferred = $.Deferred();
var promise = deferred.promise();

আমাদের কাছে এখন একটি স্থগিত বস্তু এবং স্থগিত করা বস্তুর প্রতিশ্রুতি অবজেক্ট। বিলম্বিত বস্তুর সব প্রতিশ্রুতি অবজেক্ট হিসেবে একই পদ্ধতি আছে তবে প্রতিশ্রুতি বস্তুর শুধুমাত্র পদ্ধতি আছে, .done(), .fail(), এবং .always()যা প্রতিটি নিজ নিজ জন্য বিলম্বিত বস্তু callbacks যোগ করার জন্য ব্যবহার করা হয় event। অন্যদিকে ডেফার্ড বস্তুর বিভিন্ন পদ্ধতি, সবচেয়ে গুরুত্বপূর্ণভাবে হয়েছে .resolve()এবং .reject()। এই পদ্ধতিগুলি মুলতুবি বস্তুতে ডাকা হলে সমস্ত কলব্যাকগুলি কল করা হয়। .resolve()আগুন .done()এবং .always()যখন callbacks .reject()পদ্ধতি কল .fail()এবং .always()callbacks।

সাধারণত স্থগিত করা বস্তুটি একটি ব্যক্তিগত স্কোপের মধ্যে লুকিয়ে রাখা হয় এবং প্রতিশ্রুতিযুক্ত বস্তুটি ফাংশন থেকে ফিরে আসে যাতে কলব্যাকগুলি তার উপর রাখা যায়। মুলতুবি বস্তুটি পরে সমাধান করা হবে, যেমন একটি এজাক্স অনুরোধ সম্পূর্ণ হওয়ার পরে বা কোনও চিত্র লোড হওয়ার পরে, একটি সেটটাইমআউট পরে ইত্যাদি realize এটি উপলব্ধি করাও গুরুত্বপূর্ণ যে একটি স্থগিত বস্তু কেবল একবার সমাধান করা যেতে পারে। যদি এটি ইতিমধ্যে সমাধান হয়ে যায় তবে তা কলব্যাকগুলি অবিলম্বে কল করা হবে।

এখানে আরও একটি উদাহরণ রয়েছে যা আমি ব্যবহার করি:

function loadImage(url) {
    var def = $.Deferred(),
        img = new Image();
    $(img).on("load error",function(e){
        if (e.type === "error") {
            def.reject(url);
        }
        else {
            def.resolve(url);
        }
    });
    img.src = url;
    // return the promise object so that callbacks can
    // be defined on the deferred object.
    return def.promise();
}
loadImage("foobar.jpg").done(function(){
    alert("The image is loaded!");
}).fail(function(){
    alert("The image failed to load!");
}).always(function(){
    alert("This is always called!");
});

JQuery এর $.Deferred()পদ্ধতি এবং মুলতুবি বস্তু সম্পর্কে আরও তথ্যের জন্য, http://api.jquery.com/category/deferred-object/ দেখুন


মুলতুবি কলব্যাকের ধারণাটি পাওয়ার পরে এটি সম্ভবত অমূল্য হবে। দুঃখিত, তবে আমি এখনও একটি বিলম্বিত কলব্যাক কি ধারণাটি বুঝতে পারি না। আমি এর পিছনে ধারণাগত ধারণাটি আরও সন্ধান করছি। মিহিয়ার ধারণার সাথে বাছাই করুন। একবার আমি আমার মাথাটি গোল করে পেতে পারি তবে সম্ভবত আমি জেএস বুঝতে পারি।
দশম

3

আমি নিশ্চিত নই তবে আমি বিশ্বাস করি একটি অচল কলব্যাক একটি অ্যাসিনক্রোনাস কলব্যাককে বোঝায়, সুতরাং আপনার জন্য আরও ভাল ভাগ্য গুগল করা হবে।

আমি সবচেয়ে ভাল ব্যাখ্যাটি পেয়েছি http://www.nodebeginner.org এ

আরে, সম্ভবত এক্সপ্রেসিভ ফাংশন () দয়া করে আপনার জিনিসগুলি করুন, তবে আমি, একক নোড.জেএস থ্রেড, আপনি শেষ না হওয়া পর্যন্ত এখানে অপেক্ষা করতে যাচ্ছি না, আমি নীচের কোডের লাইনগুলি চালিয়ে যাব, তাই আপনি দয়া করে গ্রহণ করবেন এই কলব্যাক ফাংশন () এখানে এবং কল করুন যখন আপনি আপনার ব্যয়বহুল জিনিসগুলি শেষ করেছেন? ধন্যবাদ! "

এই উদাহরণে, সম্ভবত এক্সপ্রেসিয়েন্ট ফাংশন একটি অ-ব্লকিং (বা অ্যাসিঙ্ক ফাংশন)। এর অর্থ এটি এখনই কার্যকর করা হয়নি, তবে তথাকথিত ইভেন্ট লুপে রাখা হয়েছে। নোড.জেএস থ্রেড কার্যকর করা অব্যাহত রাখবে, তবে কিছু সময় এটি ইভেন্ট লুপ থেকে কিছু কার্যকর করার সিদ্ধান্ত নেবে। এটি সম্ভবত এক্সপ্রেসফিউশনটিতে পৌঁছালে, এটিকে এটি কল করে এবং সম্ভবত এক্সপ্রেসিয়েন্স ফাংশন যখন এক্সিকিউশন শেষ করে, তখন এটি প্যারামিটার হিসাবে পাস হওয়া (বিলম্বিত) কলব্যাককে কল করে।

সম্ভবত এক্সপ্রেসিভ ফাংশনের উদাহরণ হিসাবে আপনি fs.readFile নিতে পারেন


ধন্যবাদ। তবে, ব্যয়বহুল ফাংশনটি কীভাবে এটি স্টাফ করতে চলেছে যদি এটি ইতিমধ্যে ফিরে আসে এবং আপনি মৃত্যুদন্ডের মূল থ্রেডে ফিরে এসেছেন? আমি কিছু না। আপনি কি বলছেন যে ফাংশনটি শেষ হওয়ার পরে কোনওভাবেই স্থির থাকে?

উত্তরটি সম্পাদিত হয়েছে, সম্ভবত এটি এখন আরও পরিষ্কার।

খুব উপকারী. তবে ... সঞ্চিত কলব্যাকের এই অ্যারেটি প্রক্রিয়া করতে হবে? আমার অর্থ কী, এটি এই তালিকাটি প্রক্রিয়াজাত করছে। এটি কি (উদাহরণস্বরূপ) জেএসএস ব্যাকগ্রাউন্ডে এই কলব্যাকগুলিকে আপনার সম্পর্কে কিছু না করার সাথে তুলবে, বা কোনও ইভেন্টটি নোড.জেএস বা কোনও বিশেষ কলব্যাক কল করার কারণ ঘটায়। দুঃখিত, আপনি যা বলছেন তার আমি
প্রায় getting০

@tenটাইমস - "এটি কী এটি এই তালিকার প্রক্রিয়াকরণ করছে" $ D .প্রযুক্ত () অবজেক্ট তালিকাটি প্রক্রিয়া করছে। আপনি যখন কল করবেন .resolve()বা .reject()আসল ডিফার্ড অবজেক্টে কল করুন তখন কলব্যাকের তালিকার কল হবে।
user400654

2
@ সময়: আপনি যা বলছেন তা থেকে, আমি নিশ্চিত নই যে আপনি জেএসে ফাংশনগুলি প্রথম-শ্রেণীর অবজেক্টস হিসাবে তৈরি করেছেন এবং এটি তৈরি হওয়ার আগে অতীত প্রয়োজন পর্যন্ত সংরক্ষণ করা যেতে পারে। যেমন আপনি কোনও ফাইলে লিখতে চান, তারপরে একটি লগ বার্তা মুদ্রণ করুন; সুতরাং আপনি "লিখন" ফাংশন (বা যাই হোক না কেন) কল করুন এবং এটি এমন একটি ফাংশন পাস করুন যা লগ বার্তাটিকে আউটপুট করে। "লিখন ()" প্রদত্ত ফাংশনটির অভ্যন্তরীণভাবে একটি রেফারেন্স সঞ্চয় করে, ফাইলটিতে লেখা শুরু করে এবং কখন লেখাটি শেষ হয় তা জানতে নিজস্ব কলব্যাক সেট আপ করে। এটি লেখার আগেই ফিরে আসে; যখন এটি হয়, আপনার ফাংশন বলা হয়।
ক্যামেরন

3

জাভাস্ক্রিপ্ট একক থ্রেডযুক্ত, সুতরাং এটি বুঝতে থ্রেডের ক্ষেত্রে আপনি ভাবতে পারবেন না। এখানে jQuery ব্যবহার করে নিয়মিত এবং অ্যাসিনক্রোনাস উভয় কলব্যাকের উদাহরণ রয়েছে:

var regularCallback = function(evt) {
    alert("I'm a callback!")
}
var asyncCallback = function(data) {
    alert("I only run when an async operation finishes!")
}

// Bind the regular callback to a button's click event
$('#mybutton').on('click', regularCallback);

// Start an ajax request to the server. The request is asynchronous, so code
// below this line will execute immediately. The callback function
// will only be called when the request is complete.
$.get("http://google.com", asyncCallback);

এখন এটি আমাকে কোথাও পেয়েছে, ধন্যবাদ। সুতরাং অ্যাসিঙ্ক্রোনাস এমন একটি ইভেন্টের প্রতিক্রিয়ায় যা আমি এজ্যাক্সের সাথে সেটআপ করেছি - যা কেবল এটি খামার করে এবং যদি ঘটনাটি ঘটে তবে আমার কলব্যাক ডেকে আনে? আমি মনে করি এটি পেয়ে যাচ্ছি। Node.js / jquery jquery usnig মুলতুবি বস্তু এবং তাদের সাথে ইন্টারঅ্যাক্ট করার একটি জটিল সিস্টেমের সাথে সত্যই ঠিক একই জিনিসটি করার জন্য কিন্তু পদ্ধতিগুলি ব্যবহার করার অনুরূপ কিছু করবে?
দশম

1
@ সময়, ঠিক! কলব্যাকগুলি সাধারণত ইভেন্টগুলির প্রতিক্রিয়াতে চালিত হয় (তবে যেহেতু "কলব্যাক" কোনও জেএস ভাষা নির্মাণ নয়, কখনও কখনও শব্দটি অন্যান্য প্রসঙ্গে ব্যবহৃত হয়)। কেভিনের উত্তরে যে বিলম্বিত বস্তু (প্রতিশ্রুতি) আপনি দেখতে পাচ্ছেন তা মূলত সিনট্যাকটিক চিনি। কিছু (অ্যাসিনক্রোনাস) ইভেন্ট ট্রিগার করা হলে তারা "সমাধান" বা "প্রত্যাখ্যানিত" হয়ে যায়, তারপরে তারা উপযুক্ত কলব্যাককে ("সম্পন্ন" বা "ব্যর্থ", তারপরে "সর্বদা") বলে। এগুলিকে jQuery এ ব্যবহার করা কোডটি আরও পঠনযোগ্য করে তুলতে পারে এবং কিছু অতিরিক্ত ট্রিক্সের জন্য অনুমতি দেয় (যেমন একটি এজ্যাক্স অনুরোধকে গুলি করার পরে সহজেই দ্বিতীয় কলব্যাক যুক্ত করা যায়, উদাহরণস্বরূপ)।
bfavareto


1

বিলম্বিত কলব্যাকস (ওরফে প্রচারগুলি ) আপনাকে ব্যথা এবং কলব্যাক স্প্যাগেটি ছাড়াই অনুক্রমিক অ্যাসিনক্রোনাস কোড লেখার অনুমতি দেয়:

$.when( doAjax(), doAnotherAjax() ).then( haveFunWithMoreAjax ).then( animateStuff );

'কখন' আপনাকে সমান্তরালে ফিরে আসার জন্য ফাংশনগুলির জন্য অপেক্ষা করতে দেয় এবং thenক্রমে শৃঙ্খলাবদ্ধ হতে পারে।

একটি নোট: jQuery স্থগিত ! = প্রতিশ্রুতি / এ , তাদের বাক্য গঠনটি কিছুটা আলাদা।

বিষয়টিতে ভাল নিবন্ধ রয়েছে: একটি আইইব্লগে এবং অন্যটি কিছু এলোমেলো ব্লগে , একটি বই এবং একটি জনপ্রিয় স্ট্যাকওভারফ্লো প্রশ্ন


1
ওহ .. এটি দেখা যাচ্ছে - ওপি কিছুটা আলাদা জিনিস জিজ্ঞাসা করেছে .. ঠিক আছে, আশা করি এই উত্তরটি অন্য কাউকে সাহায্য করবে, কোনও দিন, সম্ভবত।
c69
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.