Fabrício এর উত্তর স্পট হয়; তবে আমি তার উত্তরটি কম প্রযুক্তিগত কিছু দিয়ে পরিপূরক করতে চেয়েছিলাম, যা অ্যাসিঙ্ক্রোনসিটির ধারণাটি ব্যাখ্যা করতে সহায়তা করার জন্য সাদৃশ্যটির উপর দৃষ্টি নিবদ্ধ করে ।
একটি সাদৃশ্য ...
গতকাল, আমি যে কাজটি করছিলাম তার জন্য সহকর্মীর কিছু তথ্য দরকার ছিল required আমি তাকে বেঁধে রেখেছি; কথোপকথনটি কীভাবে চলেছিল তা এখানে:
আমার : হাই বব, আমি জানি কিভাবে আমরা প্রয়োজন foo বিন্যাস 'd বার গত সপ্তাহে d'। জিম এটির জন্য একটি প্রতিবেদন চায়, এবং আপনি কেবল তারাই এই সম্পর্কে বিশদ জানেন।
বব : অবশ্যই, তবে আমার প্রায় 30 মিনিট লাগবে?
আমি : দারুণ বব। আপনি তথ্য পেলে আমাকে আবার একটি রিং দিন!
এই মুহুর্তে, আমি ফোনটি হ্যাং করলাম। যেহেতু আমার প্রতিবেদনটি সম্পূর্ণ করার জন্য আমার কাছে ববয়ের তথ্যের প্রয়োজন ছিল, তাই আমি এই প্রতিবেদনটি ছেড়ে দিয়েছিলাম এবং পরিবর্তে একটি কফির জন্য গিয়েছিলাম, তারপরে আমি কিছু ইমেল পেয়েছিলাম। 40 মিনিট পরে (বব ধীর গতিতে), বব ফোন করেছিল এবং আমাকে প্রয়োজনীয় তথ্য দিয়েছিল। এই মুহুর্তে, আমি আমার রিপোর্ট দিয়ে আমার কাজটি আবার শুরু করেছি, কারণ আমার প্রয়োজনীয় সমস্ত তথ্য ছিল।
কল্পনা করুন যদি কথোপকথনটি এর পরিবর্তে এভাবে চলে যায়;
আমার : হাই বব, আমি জানি কিভাবে আমরা প্রয়োজন foo বিন্যাস 'd বার গত সপ্তাহে d'। জিম এটি সম্পর্কে একটি প্রতিবেদন চান, এবং আপনি কেবল তারাই এই সম্পর্কে বিশদ জানেন।
বব : অবশ্যই, তবে আমার প্রায় 30 মিনিট লাগবে?
আমি : দারুণ বব। আমি অপেক্ষা করব.
এবং আমি সেখানে বসে অপেক্ষা করছিলাম। আর অপেক্ষা করলাম। আর অপেক্ষা করলাম। 40 মিনিটের জন্য। অপেক্ষা ছাড়া কিছুই করছেন না। অবশেষে, বব আমাকে তথ্য দিয়েছিল, আমরা স্তব্ধ হয়ে গেলাম এবং আমি আমার প্রতিবেদনটি শেষ করলাম। তবে আমি 40 মিনিটের উত্পাদনশীলতা হারাতে চাই।
এটি অ্যাসিনক্রোনাস বনাম সিঙ্ক্রোনাস আচরণ
আমাদের প্রশ্নের সমস্ত উদাহরণে ঠিক এটি ঘটছে। কোনও চিত্র লোড করা, ডিস্কের বাইরে কোনও ফাইল লোড করা এবং এজেএক্সের মাধ্যমে একটি পৃষ্ঠার অনুরোধ করা সব ধীর গতি সম্পন্ন অপারেশন (আধুনিক কম্পিউটিংয়ের প্রসঙ্গে)।
এই ধীর অপারেশনগুলি সমাপ্ত হওয়ার জন্য অপেক্ষা করার পরিবর্তে , জাভাস্ক্রিপ্ট আপনাকে একটি কলব্যাক ফাংশন রেজিস্ট্রেশন করতে দেয় যা ধীর অপারেশন শেষ হয়ে গেলে কার্যকর করা হবে। ইতিমধ্যে, তবে জাভাস্ক্রিপ্ট অন্যান্য কোড চালানো চালিয়ে যাবে। সত্য যে জাভাস্ক্রিপ্ট executes অন্য কোড থাকাকালীন সম্পূর্ণ করতে ধীর ক্রিয়াকলাপের জন্য অপেক্ষা করা আচরণ তোলে অ্যাসিঙ্ক্রোনাস । অন্য কোনও কোড কার্যকর করার আগে জাভাস্ক্রিপ্ট অপারেশনটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করেছিল, এটি সিঙ্ক্রোনাস আচরণ ছিল।
var outerScopeVar;
var img = document.createElement('img');
// Here we register the callback function.
img.onload = function() {
// Code within this function will be executed once the image has loaded.
outerScopeVar = this.width;
};
// But, while the image is loading, JavaScript continues executing, and
// processes the following lines of JavaScript.
img.src = 'lolcat.png';
alert(outerScopeVar);
উপরের কোডে, আমরা জাভাস্ক্রিপ্টটি লোড করতে বলছিlolcat.png
, এটি একটি স্লুও অপারেশন। এই ধীর অপারেশনটি হয়ে গেলে কলব্যাক ফাংশনটি কার্যকর করা হবে, তবে এর মধ্যে, জাভাস্ক্রিপ্ট কোডটির পরবর্তী লাইনের প্রক্রিয়া চালিয়ে যাবে; অর্থাত alert(outerScopeVar)
।
এ কারণেই আমরা সতর্কতা দেখছি undefined
; যেহেতু alert()
চিত্রটি লোড হওয়ার পরে তাত্ক্ষণিকভাবে প্রক্রিয়া করা হবে।
আমাদের কোড ফিক্স, সব আমরা যা করতে হবে সরাতে হয় alert(outerScopeVar)
কোড মধ্যে কলব্যাক ফাংশন। এর ফলস্বরূপ, আমাদের আর outerScopeVar
বিশ্বব্যাপী ভেরিয়েবল হিসাবে ঘোষিত ভেরিয়েবলের প্রয়োজন নেই ।
var img = document.createElement('img');
img.onload = function() {
var localScopeVar = this.width;
alert(localScopeVar);
};
img.src = 'lolcat.png';
আপনি সবসময় দেখতে পাবেন কলব্যাকটি একটি ফাংশন হিসাবে নির্দিষ্ট করা হয়েছে, কারণ জাভাস্ক্রিপ্টের একমাত্র * উপায় কিছু কোড সংজ্ঞায়িত করার, তবে এটি পরবর্তীকালে চালানো নয়।
অতএব, আমাদের সমস্ত উদাহরণে function() { /* Do something */ }
কলব্যাক; সমস্ত উদাহরণ ঠিক করার জন্য , আমাদের যা করতে হবে তা হল কোডটি সরানো যা সেখানে অপারেশনের প্রতিক্রিয়া প্রয়োজন!
* প্রযুক্তিগতভাবে আপনি এটিও ব্যবহার করতে পারেন eval()
তবে eval()
এটি এই উদ্দেশ্যে মন্দ
আমি আমার কলারকে কীভাবে অপেক্ষা করব?
আপনার কাছে বর্তমানে এর মতো কিছু কোড থাকতে পারে;
function getWidthOfImage(src) {
var outerScopeVar;
var img = document.createElement('img');
img.onload = function() {
outerScopeVar = this.width;
};
img.src = src;
return outerScopeVar;
}
var width = getWidthOfImage('lolcat.png');
alert(width);
যাইহোক, আমরা এখন জানি যে return outerScopeVar
অবিলম্বে ঘটে যায়; onload
কলব্যাক ফাংশন পরিবর্তনশীল আপডেট করার আগে । এটি getWidthOfImage()
ফিরতে undefined
এবং undefined
সতর্ক হওয়ার দিকে পরিচালিত করে ।
এটি ঠিক করার জন্য, আমাদের ফাংশন কলিংকে getWidthOfImage()
একটি কলব্যাক নিবন্ধন করার অনুমতি দেওয়া দরকার , তারপরে প্রস্থের সতর্কতাটিকে সেই কলব্যাকের মধ্যে স্থানান্তরিত করতে হবে;
function getWidthOfImage(src, cb) {
var img = document.createElement('img');
img.onload = function() {
cb(this.width);
};
img.src = src;
}
getWidthOfImage('lolcat.png', function (width) {
alert(width);
});
... পূর্বের মতো, নোট করুন যে আমরা বিশ্বব্যাপী ভেরিয়েবলগুলি মুছে ফেলতে সক্ষম হয়েছি (এই ক্ষেত্রে width
)।