জাভাস্ক্রিপ্ট কীভাবে পটভূমিতে AJAX প্রতিক্রিয়া পরিচালনা করে?


139

যেহেতু জাভাস্ক্রিপ্টটি একক থ্রেডে চালিত হয়, একটি এজেএক্স অনুরোধ করার পরে, ব্যাকগ্রাউন্ডে আসলে কী ঘটে? আমি এটিতে আরও গভীর অন্তর্দৃষ্টি পেতে চাই, কেউ কি কিছুটা আলোকপাত করতে পারে?


6
খুব সুন্দর বর্ণনাটি এখানে: স্ট্যাকওভারফ্লো
জোনাথন এম

3
জাভাস্ক্রিপ্ট কোডটি একক থ্রেডেড (ওয়েব কর্মী ব্যতীত) তবে জাভাস্ক্রিপ্ট ইঞ্জিন চালিত ব্রাউজারটি নয় ...
হুয়ান মেন্ডেস

@ জুয়ানমেন্ডেস ইভেন্ট কিউ অন্য থ্রেডে চলাকালীন জাভাস্ক্রিপ্ট কি কোনও থ্রেডে চালিত হয়?
শন লুটিন

1
@ শানলুটিন না, ইভেন্টের সারিটি জাভাস্ক্রিপ্টটি বন্ধ করে দিয়েছে
জুয়ান মেন্ডেস

উত্তর:


213

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

এজাক্স কলের আওতাভুক্ত নেটিভ কোড নেটওয়ার্কিং কখন অজ্যাক্স প্রতিক্রিয়া সম্পন্ন হবে তা জানবে এবং জাভাস্ক্রিপ্ট ইভেন্টের সারিতে একটি ইভেন্ট যুক্ত হবে। যখন অজ্যাক্স কলটি করা হয় তখন স্থানীয় কোডটি কীভাবে জানে তা বাস্তবায়নের উপর নির্ভর করে। এটি থ্রেডগুলির সাথে প্রয়োগ করা যেতে পারে বা এটি নিজেই ইভেন্ট চালিত হতে পারে (এটি আসলে কোনও বিষয় নয়)। বাস্তবায়নের বিষয়টি হ'ল এজ্যাক্সের প্রতিক্রিয়াটি শেষ হয়ে গেলে কিছু নেটিভ কোড জানবে যে এটি হয়েছে এবং জেএস সারিতে একটি ইভেন্ট স্থাপন করবে।

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

কারণ জাভাস্ক্রিপ্ট আসলে অন্য কিছু চলমান থাকাকালীন সমস্ত বাইরের ইভেন্টগুলি ইভেন্টের কাতারে যায় এবং কোনও ইভেন্ট কখনই ট্রিগার হয় না, এটি একক থ্রেডযুক্ত থাকে।

বিশদ সম্পর্কে এখানে কিছু নিবন্ধ দেওয়া হয়েছে:


তার জন্য ধন্যবাদ. আমি সন্দেহ করি এটি ছিল কেস, তবে নিশ্চিতভাবে জানা ভাল। আমার কাছে একটি লুপ রয়েছে, যার মধ্যে আমি প্রচুর 'এজ্যাক্স' অনুরোধগুলি প্রেরণ করি। আমার হ্যান্ডলারে (প্রতিটি অনুরোধের জন্য - স্বেচ্ছায় ক্রমে ফিরে এসেছে) আমি এমন কিছু কোড চালাই যা কিছুটা সময় নিতে পারে। এটি অবশ্যই কাজ করা উচিত জেনে রাখা ভাল।
আইপ্যাড ডেভেলপার ২০১১

4
@telandor - ইভেন্টগুলি ফিফোর ক্রমে পরিচালিত হয় (এটি সম্ভব কিছু ব্যতিক্রমী ক্ষেত্রে ব্যতিক্রম, তবে অভিপ্রায়টি FIFO)। কিছু ঘটনা কিছুটা আলাদাভাবে চিকিত্সা করা হয়। উদাহরণস্বরূপ মাউস সরানোর ইভেন্টগুলি কাতারে স্তূপাকার হয় না (সম্ভবত তারা সহজেই কাতাকে উপচে ফেলতে পারে কারণ)। যখন মাউসটি সরানো হয় এবং একটি মাউসমেভ ইভেন্ট ইতিমধ্যে কাতারে থাকে এবং কাতারে আর কোনও নতুন ইভেন্ট না থাকে, নতুন ইভেন্ট যুক্ত হওয়ার পরিবর্তে এটি সর্বশেষ অবস্থানে আপডেট হয়। আমি অনুমান করব যে ব্যবধানে টাইমার ইভেন্টগুলি কাতারে পাইলিং এড়ানোর জন্য সম্ভবত বিশেষভাবে চিকিত্সা করা হয়।
jender00

2
@telandor - আপনার আরও কি ব্যাখ্যা করা দরকার? এটি ফিফো আমি আমার উত্তরে আরও কয়েকটি রেফারেন্স নিবন্ধ যুক্ত করেছি। ফিফোর একমাত্র মৃত্যুদণ্ড যা আমি সচেতন তা অবিলম্বে ইভেন্টগুলি ট্রিগার করা হয়। আপনি .focus()কোনও আইটেমটিতে কল করেছেন এবং এটি ফোকাস সহ আইটেমটিতে একটি "ঝাপসা" ইভেন্টের মতো কয়েকটি ইভেন্টকে ট্রিগার করে। এই অস্পষ্ট ঘটনাটি সিঙ্ক্রোনসিভভাবে ঘটে এবং ইভেন্টের সারিটির মধ্য দিয়ে যায় না তাই ইভেন্টের সারিতে থাকা অন্যান্য জিনিসের আগেই এটি ঘটে চলে। বাস্তবে, আমি এটি ব্যবহারিক উদ্বেগ বলে মনে করি না।
jفر00

2
@telandor - ব্রাউজার নথিতে একাধিক সারি নেই। এখানে একটি সারি রয়েছে এবং সবকিছু ফিফোর ইন / আউট হয়ে যায়। সুতরাং সময়সীমা এবং এজাক্স প্রতিক্রিয়া এবং মাউস ইভেন্ট এবং কীবোর্ড ইভেন্টগুলি একই কাতারে যায়। যাকেই কাতারে রেখে প্রথমে রান করা হয়।
jفر00

1
@ ক্লিনক্রিস্পকোড - থেক্স আমি আমার উত্তরের একটি দরকারী রেফারেন্স হিসাবে এটিকে যুক্ত করেছি।
jfriend00

16

আপনি এখানে জাভাস্ক্রিপ্টে পরিচালিত ইভেন্টগুলির একটি খুব সম্পূর্ণ ডকুমেন্টেশন খুঁজে পেতে পারেন ।
এটি অপেরা ব্রাউজারে জাভাস্ক্রিপ্ট প্রয়োগে কাজ করে এমন একজন লোক লিখেছেন।

আরও স্পষ্টভাবে শিরোনামগুলি দেখুন: "ইভেন্ট ফ্লো", "ইভেন্ট কুইউনিং" এবং "অ-ব্যবহারকারীর ইভেন্টগুলি": আপনি এটি শিখবেন:

  1. জাভাস্ক্রিপ্ট প্রতিটি ব্রাউজারের ট্যাব বা উইন্ডোর জন্য একক থ্রেডে চলমান।
  2. ইভেন্টগুলি সারিবদ্ধভাবে সারিবদ্ধভাবে কার্যকর করা হয়।
  3. এক্সএমএলএইচটিপিআরকোয়েস্ট বাস্তবায়ন দ্বারা চালিত হয় এবং ইভেন্টের সারিটি ব্যবহার করে কলব্যাকগুলি চালিত হয়।

দ্রষ্টব্য: মূল লিঙ্কটি ছিল: লিঙ্ক , তবে এখন মারা গেছে।


1

উত্তরে বর্ণিত এজাক্স বাস্তবায়ন সম্পর্কে আমি কিছুটা বিস্তারিত বলতে চাই।

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

এবং আমি ব্যাখ্যা করব, আসুন নীচের কোডটি গ্রহণ করুন:

var xhr = new XMLHttpRequest();

var t = Date.now;
xhr.open( "GET", "https://swx.cdn.skype.com/shared/v/1.2.15/SkypeBootstrap.min.js?v="+t(), true );

xhr.onload = function( e ) {
		console.log(t() + ': step 3');
    
    alert(this.response.substr(0,20));
};
console.log(t() + ': step 1');
xhr.send();
console.log(t() + ': step 2');

after an AJAX request is made(- প্রথম ধাপের পরে), তারপরে আপনার জেএস কোডটি কার্যকর করার সময় (পদক্ষেপ 2 এবং তারপরে) ব্রাউজারটি আসল কাজটি শুরু করে: 1. টিসিপি অনুরোধের বিন্যাসকরণ 2. সকেট খোলার 3. শিরোনাম প্রেরণ 4. হ্যান্ডশেকিং 5. প্রেরণ বডি 6. অপেক্ষার প্রতিক্রিয়া 7.. পঠন শিরোনাম ৮. পড়া পড়া শরীর ইত্যাদি এই সমস্ত বাস্তবায়ন সাধারণত আপনার জেএস কোড সম্পাদনের সমান্তরালে আলাদা থ্রেডে চালিত হয়। উদাহরণস্বরূপ, উল্লিখিত ক্রোমিয়াম বাস্তবায়ন থ্রেডেবল লোডার ব্যবহার করে ডিগ-ইন , (আপনি কোনও পৃষ্ঠার লোডের নেটওয়ার্ক ট্যাবটি দেখে কিছুটা প্রভাব ফেলতে পারেন, আপনি কিছু যুগপত অনুরোধগুলি দেখতে পাবেন)।

উপসংহারে, আমি বলব - কমপক্ষে - আপনার I / O অপারেশনগুলির বেশিরভাগই একসাথে / async তৈরি করা যেতে পারে (এবং আপনি উদাহরণের জন্য অপেক্ষা করে এটির সুবিধা নিতে পারেন )। তবে এই ক্রিয়াকলাপগুলির সাথে সমস্ত ইন্ট্যারাকশন (ইস্যু করা, জেএস কলব্যাক এক্সিকিউশন) সমস্ত সিঙ্ক্রোনাস।

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