দেখে মনে হচ্ছে বেশিরভাগই এক্সএমএলএইচটিপিআরকুয়েস্টের সাথে অ্যাসিঙ্ক্রোনাস অনুরোধ করে তবে স্পষ্টতই যে সিঙ্ক্রোনাস অনুরোধগুলি করার ক্ষমতা রয়েছে তা ইঙ্গিত দেয় যে এটি করার উপযুক্ত কারণ থাকতে পারে। সুতরাং যে বৈধ কারণ হতে পারে?
দেখে মনে হচ্ছে বেশিরভাগই এক্সএমএলএইচটিপিআরকুয়েস্টের সাথে অ্যাসিঙ্ক্রোনাস অনুরোধ করে তবে স্পষ্টতই যে সিঙ্ক্রোনাস অনুরোধগুলি করার ক্ষমতা রয়েছে তা ইঙ্গিত দেয় যে এটি করার উপযুক্ত কারণ থাকতে পারে। সুতরাং যে বৈধ কারণ হতে পারে?
উত্তর:
আমি মনে করি তারা এইচটিএমএল 5 মানের অগ্রগতি হিসাবে আরও বেশি জনপ্রিয় হতে পারে। যদি কোনও ওয়েব অ্যাপ্লিকেশনকে ওয়েব কর্মীদের অ্যাক্সেস দেওয়া হয় তবে আমি ডেভেলপারদের ডেডিকেটেড ওয়েব কর্মী ব্যবহার করে সিঙ্ক্রোনাস অনুরোধগুলি করতে অনুরোধ করতে পারি, যেমন জোনাথন বলেছিলেন, যাতে একটি অনুরোধ অন্যটির আগে ঘটে তা নিশ্চিত হয়ে যায়। একটি থ্রেডের বর্তমান পরিস্থিতির সাথে, অনুরোধটি সম্পূর্ণ না হওয়া পর্যন্ত এটি আদর্শ নকশার চেয়ে কম অবরুদ্ধ।
সিঙ্ক্রোনাস এক্সএইচআরগুলি ব্যবহারকারীর ডেটা সংরক্ষণের জন্য দরকারী। আপনি যদি beforeunload
ইভেন্টটি পরিচালনা করেন তবে ব্যবহারকারী পৃষ্ঠাটি বন্ধ করার সাথে সাথে আপনি সার্ভারে ডেটা আপলোড করতে পারেন।
যদি এটি async বিকল্পটি ব্যবহার করে করা হয়, তবে অনুরোধটি সম্পূর্ণ হওয়ার আগে পৃষ্ঠাটি বন্ধ হয়ে যেতে পারে। এটি সমকালীনভাবে করা নিশ্চিত করে একটি অনুরোধটি প্রত্যাশিত উপায়ে সম্পূর্ণ বা ব্যর্থ হয়েছে।
নীচের দিকে ইঙ্গিত করা হয়েছিল - তবে বিতরণে ব্যর্থ হয়েছিল - উন্নত অ্যাসিনক্রোনাস অনুরোধ হ্যান্ডলিংয়ের আবির্ভাবের সাথে সিঙ্ক্রোনাস অনুরোধগুলি ব্যবহার করার সত্যিই কোন কারণ নেই, যদি না কোনও অনুরোধ সম্পূর্ণ না হওয়া পর্যন্ত উদ্দেশ্যমূলকভাবে ব্যবহারকারীদের কিছু করা থেকে বিরত না করা - দূষিত মনে হয়: )
যদিও এটি খারাপ শোনাতে পারে, এমন অনেক সময় থাকতে পারে যে কোনও ব্যবহারকারী কোনও পৃষ্ঠা ছাড়ার আগে, বা কোনও ক্রিয়া সম্পাদনের আগে - একটি অনুরোধ (বা অনুরোধের ধারাবাহিক) ঘটতে পারে - অন্যান্য কোড কার্যকরকরণ (যেমন, পিছনের বোতামটি আটকাতে) আটকাতে পারে সম্ভবত একটি খারাপ নকশা করা সিস্টেমের জন্য ত্রুটি / রক্ষণাবেক্ষণ হ্রাস করুন ; এটি বলেছিল, আমি এটিকে বন্য এবং চাপের মধ্যে কখনও দেখিনি যে এটি এড়ানো উচিত।
প্রতিশ্রুতির মতো গ্রন্থাগারগুলি, কলব্যাকের মাধ্যমে প্রক্রিয়াগুলি শৃঙ্খলাবদ্ধ করে সিঙ্ক্রোনিকটি ফেইন করে। এটি ব্রাউজারদের ব্যবহারকারীর (প্রতিক্রিয়াশীলতা) ভাল রাখার পক্ষে সক্ষম হওয়া-অ-ব্লকিং ইভেন্টগুলির অর্ডার করার জন্য আকাঙ্ক্ষিত বেশিরভাগ বিকাশের চাহিদার স্যুট করে।
মোজিলা ডক্সে যেমন বলা আছে সেখানে এমন কিছু মামলা রয়েছে যেখানে আপনাকে সিঙ্ক্রোনাস অনুরোধগুলি ব্যবহার করতে হবে; যাইহোক, এছাড়াও তালিকাভুক্ত হ'ল একটি কাজ যা এই জাতীয় ক্ষেত্রে বীকন ব্যবহার করে (আইই / সাফারি তে উপলব্ধ নয়)। এটি পরীক্ষামূলক হলেও এটি যদি মান-গ্রহণযোগ্যতায় পৌঁছে যায় তবে এটি সম্ভবত সিঙ্ক্রোনাস-অনুরোধ কফিনে একটি পেরেক লাগিয়ে দিতে পারে।
আপনি যেকোন ধরণের লেনদেনের মতো প্রক্রিয়াজাতকরণ বা যেখানেই কোনও ক্রমের ক্রম প্রয়োজন সেখানে সিঙ্ক্রোনাস কল করতে চান।
উদাহরণস্বরূপ, ধরা যাক আপনি একটি গান বাজানোর পরে আপনাকে লগ আউট করতে একটি ইভেন্ট কাস্টমাইজ করতে চান। যদি প্রথমে লগআউট অপারেশন হয় তবে গানটি আর বাজবে না। এর জন্য অনুরোধগুলি সিঙ্ক্রোনাইজ করা দরকার।
অন্য কোনও কারণ হ'ল কোনও ওয়েব সার্ভিসের সাথে কাজ করার সময়, বিশেষত সার্ভারে গণিত করার সময়।
উদাহরণ: সার্ভারের 1 এর মান সহ একটি পরিবর্তনশীল রয়েছে।
Step (1) Perform Update: add 1 to variable Step (2) Perform Update: set variable to the power of 3 End Value: variable equals 8
পদক্ষেপ (2) যদি প্রথম দেখা দেয় তবে শেষের মানটি 2 নয়, 8 হয়; এইভাবে অপারেশন সম্পর্কিত ক্রম এবং সিঙ্ক্রোনাইজেশন প্রয়োজন।
খুব অল্প সময় এসেছে যে একটি সিঙ্ক্রোনাস কলটি সাধারণ বাস্তব বিশ্বের উদাহরণে ন্যায়সঙ্গত হতে পারে। লগইন ক্লিক করার সময় এবং তারপরে সাইটের কোনও অংশে ক্লিক করার সময় কোনও ব্যবহারকারীকে লগ ইন করার প্রয়োজন হয়।
অন্যরা যেমন বলেছে, এটি আপনার ব্রাউজারটি বেঁধে রাখবে, তাই আপনি যেখানে পারেন সেখানে থেকে দূরে থাকুন।
সিঙ্ক্রোনাস কলগুলির পরিবর্তে, প্রায়শই ব্যবহারকারীরা বর্তমানে লোড হচ্ছে এমন একটি ইভেন্ট বন্ধ করতে চান এবং তারপরে অন্য কোনও ক্রিয়াকলাপ সম্পাদন করতে চান। প্রথম ঘটনাটি দ্বিতীয় শুরুর আগেই প্রস্থান করা হওয়ায় এটি একটি উপায়ে সিঙ্ক্রোনাইজেশন। এটি করার জন্য, এক্সএমএল সংযোগের অবজেক্টে Abort () পদ্ধতিটি ব্যবহার করুন।
আমি বলব যে আপনি যদি অনুরোধটি গ্রহণযোগ্য হয়ে ওঠার সময় ব্যবহারকারীর ব্রাউজারটিকে অবরুদ্ধ করার বিষয়টি বিবেচনা করে থাকেন, তবে নিশ্চিতভাবে একটি সংকালীন অনুরোধটি ব্যবহার করুন।
যদি অনুরোধগুলির সিরিয়ালাইজেশনটি আপনার লক্ষ্য হয়, তবে আপনার পূর্ববর্তী অনুরোধটির অনকম্পিউড কলব্যাকটি পরের লাইনে ফায়ার করে, এটি async অনুরোধগুলি ব্যবহার করে সম্পন্ন করা যায়।
এমন অনেক বাস্তব বিশ্বের কেস রয়েছে যেখানে ইউআইকে ব্লক করা হ'ল পছন্দসই আচরণ।
একাধিক ক্ষেত্র সহ একটি অ্যাপ্লিকেশন নিন এবং কিছু ক্ষেত্র অবশ্যই এই ক্ষেত্রের মান এবং অন্যান্য ক্ষেত্রের মানগুলিকে ইনপুট হিসাবে সরবরাহ করে এমন একটি রিমোট সার্ভারে এক্সএমএলএইচটিপি কল দ্বারা বৈধ হওয়া উচিত।
সিঙ্ক্রোনাস মোডে, যুক্তিটি সহজ, ব্যবহারকারী দ্বারা ব্লক করা অভিজ্ঞতা খুব সংক্ষিপ্ত এবং কোনও সমস্যা নেই।
অ্যাসিঙ্ক মোডে, প্রাথমিকটি যাচাইকরণের সময় ব্যবহারকারী অন্য যে কোনও ক্ষেত্রের মান পরিবর্তন করতে পারে। এই পরিবর্তনগুলি প্রাথমিক ক্ষেত্রের মানগুলি সহ এখনও বৈধ নয় যাচাই করা সহ অন্যান্য এক্সএমএলএইচটিপি কলগুলি ট্রিগার করবে। প্রাথমিক বৈধতা ব্যর্থ হলে কী হবে? খাঁটি গন্ডগোল যদি সিঙ্ক মোডটি অবচয় এবং নিষিদ্ধ হয়ে যায় তবে অ্যাপ্লিকেশন যুক্তি হ্যান্ডেল করার জন্য একটি দুঃস্বপ্ন হয়ে ওঠে। মূলত অ্যাপ্লিকেশনটি লকগুলি পরিচালনা করতে পুনরায় লিখতে হবে (যেমন বৈধকরণ প্রক্রিয়া চলাকালীন অন্যান্য আইটেমগুলি অক্ষম করুন)। কোড জটিলতা মারাত্মকভাবে বৃদ্ধি পায়। এটি করতে ব্যর্থ হওয়াতে যুক্তি ব্যর্থতা এবং শেষ পর্যন্ত ডেটা দুর্নীতি হতে পারে।
মূলত প্রশ্নটি হল: আরও গুরুত্বপূর্ণ, অবরুদ্ধ UI অভিজ্ঞতা বা ডেটা দুর্নীতির ঝুঁকি কী? উত্তরটি অ্যাপ্লিকেশন বিকাশকারীর কাছে থাকা উচিত, ডাব্লু 3 সি এর সাথে নয়।
আমি সিঙ্ক্রোনাস এক্সএইচআর অনুরোধগুলির ব্যবহারের জন্য দেখতে পাচ্ছি যখন পৃষ্ঠায় অন্যান্য স্থিতিশীল সংস্থানগুলির পূর্বে কোনও চলক স্থানের কোনও সংস্থান লোড করা আবশ্যক যা সম্পূর্ণরূপে কাজ করার জন্য প্রথম সংস্থার উপর নির্ভর করে। প্রকৃতপক্ষে, আমি আমার নিজের একটি সামান্য সাব-প্রজেক্টে এই জাতীয় এক্সএইচআর অনুরোধটি বাস্তবায়ন করছি যেখানে জাভাস্ক্রিপ্ট সংস্থানগুলি নির্দিষ্ট পরামিতিগুলির একটি সেটের উপর নির্ভর করে সার্ভারে চলক স্থানে থাকে। পরবর্তী জাভাস্ক্রিপ্ট সংস্থানগুলি সেই পরিবর্তনশীল সংস্থাগুলির উপর নির্ভর করে এবং এই জাতীয় ফাইলগুলি অন্যান্য নির্ভরশীল ফাইলগুলি লোড হওয়ার আগে লোড করার নিশ্চয়তা দিতে হবে, ফলে অ্যাপ্লিকেশনটি সম্পূর্ণ হয়ে ওঠে।
এই ধারণা ফাউন্ডেশনটি সত্যই ধরণের ভোলআরনের উত্তরে প্রসারিত হয়। লেনদেন-ভিত্তিক পদ্ধতিগুলি কেবলমাত্র একমাত্র সময় যেখানে সিঙ্ক্রোনাস অনুরোধ করা উচিত। অন্যান্য ক্ষেত্রে, অ্যাসিনক্রোনাস কলগুলি আরও ভাল বিকল্প, কল করার পরে, ডওমকে প্রয়োজনীয় হিসাবে আপডেট করা হয়। অনেকগুলি ক্ষেত্রে, যেমন ব্যবহারকারী-ভিত্তিক সিস্টেমগুলিতে, "অননুমোদিত ব্যবহারকারীদের" প্রতি, লগ ইন না হওয়া পর্যন্ত আপনার কিছু বৈশিষ্ট্যগুলি লক থাকতে পারে those এই বৈশিষ্ট্যগুলি, অ্যাসিনক্রোনাস কলয়ের পরে, ডিওএম আপডেট পদ্ধতির মাধ্যমে আনলক করা থাকে।
আমাকে শেষ পর্যন্ত বলতে হবে যে আমি এই বিষয়ে বেশিরভাগ ব্যক্তির পয়েন্টগুলির সাথে একমত: যেখানেই সম্ভব, সিঙ্ক্রোনাস এক্সএইচআর অনুরোধগুলি এড়ানো উচিত, এটি যেভাবে কাজ করে, ব্রাউজারটি সিঙ্ক্রোনাস কলগুলির সাথে লক করে দেয়। সিঙ্ক্রোনাস অনুরোধগুলি প্রয়োগ করার সময় সেগুলি এমনভাবে করা উচিত যেখানে ব্রাউজারটি সাধারণত লক হয়ে যায়, যাইহোক, পৃষ্ঠা লোডিংয়ের প্রকৃতপক্ষে ঘটনার আগে হেড বিভাগে বলুন।
২০১৫ সালের হিসাবে ডেস্কটপ জাভাস্ক্রিপ্ট অ্যাপস আরও জনপ্রিয় হয়ে উঠছে। সাধারণত সেই অ্যাপগুলিতে স্থানীয় ফাইলগুলি লোড করার সময় (এবং এক্সএইচআর ব্যবহার করে এগুলি লোড করা পুরোপুরি বৈধ বিকল্প), লোডের গতি এত দ্রুত হয় যে অ্যাসিঙ্কের সাথে কোডটির ওভারকম্প্লিকেশন খুব কমই হয়। অবশ্যই এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে অ্যাসিঙ্কটি যাওয়ার উপায় (ইন্টারনেট থেকে সামগ্রীর জন্য অনুরোধ করা, সত্যই বড় ফাইলগুলি বা একক ব্যাচে বিশাল সংখ্যক ফাইল লোড করা), তবে অন্যথায় সিঙ্কটি ঠিক কাজ করে (এবং এটি ব্যবহার করা আরও সহজ) ।
jQuery অভ্যন্তরীণভাবে কিছু পরিস্থিতিতে সিঙ্ক্রোনাস এজেএক্স ব্যবহার করে। এইচটিএমএল সন্নিবেশ করাকালীন যেখানে স্ক্রিপ্ট রয়েছে, ব্রাউজারটি এগুলি কার্যকর করে না। স্ক্রিপ্টগুলি ম্যানুয়ালি কার্যকর করা দরকার। এই স্ক্রিপ্টগুলি ক্লিক হ্যান্ডলার সংযুক্ত করতে পারে। ধরে নিন হ্যান্ডলার সংযুক্ত হওয়ার আগে কোনও ব্যবহারকারী কোনও উপাদানকে ক্লিক করে এবং পৃষ্ঠাটি যেমন ইচ্ছা তেমন কাজ করবে না। সুতরাং জাতির শর্ত রোধ করতে, এই স্ক্রিপ্টগুলি আনতে সিঙ্ক্রোনাস এজেএক্স ব্যবহার করা হবে। যেহেতু সিঙ্ক্রোনাস এজেএক্স কার্যকরভাবে সমস্ত কিছুকে অবরুদ্ধ করে, এটি নিশ্চিত হওয়া যায় যে স্ক্রিপ্টগুলি এবং ইভেন্টগুলি সঠিক ক্রমে কার্যকর করা হয়েছে।
কারণ:
ধরা যাক আপনার একটি এজ্যাক্স অ্যাপ্লিকেশন রয়েছে যা ব্যবহারকারীর কোনও ইন্টারঅ্যাকশন করার আগে সার্ভার থেকে বিভিন্ন ডেটা লোড করার জন্য অর্ধ ডজন HTTP করা দরকার।
অবশ্যই আপনি এটি লোড থেকে ট্রিগার করতে চান।
কোডটির সাথে কোনও সংযুক্ত জটিলতা ছাড়াই সিঙ্ক্রোনাস কলগুলি খুব ভালভাবে কাজ করে। এটা সহজ এবং সোজা।
খসড়া:
একমাত্র অপূর্ণতা হ'ল সমস্ত ডেটা লোড না হওয়া বা টাইমআউট না হওয়া পর্যন্ত আপনার ব্রাউজারটি লকআপ থাকে। প্রশ্নে থাকা এজাক্স অ্যাপ্লিকেশন হিসাবে, এটি খুব একটা সমস্যা নয় কারণ প্রাথমিকভাবে সমস্ত ডেটা লোড না করা পর্যন্ত অ্যাপ্লিকেশনটির কোনও ব্যবহার হয় না of
বিকল্প?
তবে জাভাস্ক্রিপ্ট যখন কোনও একটিতে ব্যস্ত থাকাকালীন অনেকগুলি ব্রাউজার সমস্ত উইন্ডো / ট্যাবগুলি লক করে রাখে, যা একটি বোকা ব্রাউজার ডিজাইন সমস্যা - তবে ফলস্বরূপ সম্ভবত ধীর গতির নেটওয়ার্কগুলিতে ব্লক করা ভদ্র নয়, যদি এটি ব্যবহারকারীদের অন্যান্য ট্যাব ব্যবহার করা থেকে বিরত রাখে এজাক্স পৃষ্ঠাটি লোড হওয়ার অপেক্ষায় থাকাকালীন।
তবে, দেখে মনে হচ্ছে যে সাময়িকভাবে পাওয়া যাইহোক সাম্প্রতিক ব্রাউজারগুলি থেকে সরানো বা সীমাবদ্ধ করা হয়েছে। আমি নিশ্চিত নই কারণ এটির কারণেই কেউ সিদ্ধান্ত নিয়েছে যে তারা সর্বদা খারাপ, বা যদি ব্রাউজার লেখকরা বিষয়টিতে ডাব্লুসি ওয়ার্কিং ড্রাফ্ট দ্বারা বিভ্রান্ত হন।
http://www.w3.org/TR/2012/WD-XMLHttpRequest-20120117/# তম- ধারণা এটি- ওপেন-স্মৃতিশক্তি এটিকে দেখতে দেখতে দেয় (বিভাগ 4.7.3 দেখুন) ব্লকিং মোড ব্যবহার করার সময় আপনাকে সময়সীমা নির্ধারণের অনুমতি দেওয়া হবে না । আমার কাছে কাউন্টারটিকে স্বজ্ঞাত বলে মনে হচ্ছে: যখনই কেউ যুক্তিসঙ্গত সময়সীমা নির্ধারণের জন্য আইওকে ব্লক করে না, তবে আইওকে ব্লক করার অনুমতি দেওয়া হলেও কোনও ব্যবহারকারী নির্দিষ্ট সময়সীমার সাথে নয়?
আমার মতে আইও ব্লক করা কিছু পরিস্থিতিতে গুরুত্বপূর্ণ ভূমিকা রাখে তবে সঠিকভাবে প্রয়োগ করতে হবে। অন্য কোনও ট্যাব বা উইন্ডোতে লক করা কোনও ব্রাউজারের ট্যাব বা উইন্ডোর পক্ষে গ্রহণযোগ্য নয়, এটি ব্রাউজার ডিজাইনের ত্রুটি। লজ্জা যেখানে নির্ধারিত হয়। তবে কিছু ক্ষেত্রে সুনির্দিষ্ট ট্যাব বা উইন্ডো কয়েক সেকেন্ডের জন্য (যেমন আইও / এইচটিটিপি ব্লক ব্লক ব্যবহার করে) অ-প্রতিক্রিয়াশীল হতে পারে তা পুরোপুরি গ্রহণযোগ্য - উদাহরণস্বরূপ, পৃষ্ঠা লোডে, সম্ভবত প্রচুর ডেটা যাইহোক যাইহোক কিছু করার আগে হওয়া দরকার। কখনও কখনও সঠিকভাবে প্রয়োগ করা ব্লকিং কোড এটি করার সবচেয়ে সহজ উপায়।
এই ক্ষেত্রে অবশ্যই সমতুল্য ফাংশনটি অ্যাসিনক্রোনাস এইচটিসি ব্যবহার করে প্রাপ্ত করা যেতে পারে, তবে কোন ধরণের মূর্খ রুটিনের প্রয়োজন?
আমার ধারণা আমি এই লাইনের সাথে কিছু চেষ্টা করব:
ডকুমেন্ট লোডে, নিম্নলিখিতটি করুন: 1: 6 টি গ্লোবাল "সম্পন্ন" ফ্ল্যাগ ভেরিয়েবল সেট আপ করুন, শুরুতে 0 এ শুরু করুন 2 2: সমস্ত 6 ব্যাকগ্রাউন্ড পেয়েছে কার্যকর করুন (ধরে নিলেন অর্ডারটি কোনও ব্যাপার নয়)
তারপরে, http টি HTTP get এর প্রত্যেকটির জন্য সম্পূর্ণ কলব্যাকগুলি তাদের নিজ নিজ "সম্পন্ন" পতাকা সেট করবে। এছাড়াও, প্রতিটি কলব্যাক অন্যান্য 6 টি এইচটিটিপি সম্পন্ন হয়েছে কিনা তা দেখতে অন্যান্য সমস্ত সম্পন্ন পতাকাগুলি পরীক্ষা করে দেখবে। শেষের কলব্যাকটি শেষ হওয়ার পরে, অন্য সমস্ত কিছুর কাজ শেষ হয়ে গেছে দেখে রিয়েল আরআর ফাংশনটি কল করবে যা তখন সমস্ত কিছু সেট আপ করে দেবে, এখন তথ্যটি সমস্ত তথ্য আনা হয়েছে।
যদি আনার ক্রমটি বিবেচিত হয় - বা যদি ওয়েবসারভার একই সাথে একাধিক অনুরোধগুলি গ্রহণ করতে অক্ষম হয় - তবে আপনার এই জাতীয় কিছু দরকার হবে:
অনলোড () এ, প্রথম এইচটিপি গেট চালু করা হবে। এটির কলব্যাকে, দ্বিতীয়টি চালু করা হবে। এর কলব্যাকে, তৃতীয় - এবং আরও অনেক কিছু, প্রতিটি কলব্যাক পরের এইচটিটিপি জিইটি চালু করে। শেষটি যখন ফিরে আসবে, তখন এটি আসল আরম্ভ () রুটিনকে কল করবে।
আপনি যদি প্রোডাকশন কোডে সিঙ্ক্রোনাস কল করেন তবে কী হবে?
আকাশ নিচে পড়েছে।
কোনও গুরুত্ব সহকারে, ব্যবহারকারী একটি লকড ব্রাউজার পছন্দ করেন না।
আমি ব্যবহারকারীর নামটি যাচাই করতে ব্যবহার করি, চেক চলাকালীন যে ব্যবহারকারীর নামটি ইতিমধ্যে বিদ্যমান নেই।
আমি জানি যে এটি অবিচ্ছিন্নভাবে করা আরও ভাল হবে তবে তারপরে আমার এই নির্দিষ্ট বৈধকরণের নিয়মের জন্য একটি আলাদা কোড ব্যবহার করা উচিত। আমি আরও ভাল ব্যাখ্যা। আমার বৈধতা সেটআপটি কিছু বৈধতা ফাংশন ব্যবহার করে, যা তথ্য বৈধ কিনা তা নির্ভর করে সত্য বা মিথ্যা প্রত্যাবর্তন করে।
যেহেতু ফাংশনটি ফিরতে হবে, আমি অ্যাসিনক্রোনাস কৌশলগুলি ব্যবহার করতে পারি না, তাই আমি কেবল এটি সংকালিক করে তুলি এবং আশা করি যে সার্ভারটি তাত্ক্ষণিকভাবে যথেষ্ট উত্তর দেবে না এমন উত্তর দেবে। আমি যদি একটি এজেএক্স কলব্যাক ব্যবহার করি তবে আমাকে অন্যান্য কার্যকরকরণের পদ্ধতিগুলির চেয়ে পৃথক সম্পাদনটি পরিচালনা করতে হবে।
false
) এবং যখন সার্ভার প্রতিক্রিয়া জানায় তখন সত্য বা মিথ্যাতে সেট করে। ক্ষেত্রটি অন্বেষণ করে আপনি পতাকাটি পুনরায় সেট করেন এবং আবার সার্ভারকে কল করেন।
কখনও কখনও আপনার একটি ক্রিয়া থাকে যা অন্যের উপর নির্ভর করে। উদাহরণস্বরূপ, অ ক্রিয়াকলাপ কেবল তখনই শেষ হয়ে যায় যখন এ শেষ হয়। সিঙ্ক্রোনাস পদ্ধতির ব্যবহার সাধারণত জাতিদের অবস্থা এড়ানোর জন্য করা হয় । কখনও কখনও সিঙ্ক্রোনাস কল ব্যবহার করা একটি সহজ বাস্তবায়ন হয় তারপরে একে অপরের উপর নির্ভরশীল আপনার অ্যাসিনক্রোনাস কলগুলির প্রতিটি রাজ্য পরীক্ষা করার জন্য জটিল যুক্তি তৈরি করে।
এই পদ্ধতির সমস্যাটি হ'ল ক্রিয়া শেষ না হওয়া পর্যন্ত আপনি ব্যবহারকারীর ব্রাউজারটিকে "ব্লক" করুন (যতক্ষণ না অনুরোধটি ফিরে না আসা, শেষ, বোঝা ইত্যাদি) না হয়। তাই এটি ব্যবহার করার সময় সতর্কতা অবলম্বন করুন।
কোড বিকাশ করার সময় আমি সিঙ্ক্রোনাস কলগুলি ব্যবহার করি- অনুরোধটি সার্ভারের কাছে এবং আসার সময় আপনি যা কিছু করেছিলেন ত্রুটির কারণকে অস্পষ্ট করতে পারেন।
যখন এটি কাজ করছে, আমি এটিকে অবিচ্ছিন্ন করে তুলি, তবে আমি কোনও অ্যাওর্ট টাইমার এবং ব্যর্থতা কলব্যাকগুলি অন্তর্ভুক্ত করার চেষ্টা করি, কারণ আপনি কখনই জানেন না ...
এসওয়াইএনসি বনাম এএসআইএনসি: পার্থক্য কী?
মূলত এটি এ পর্যন্ত ফোটে:
console.info('Hello, World!');
doSomething(function handleResult(result) {
console.info('Got result!');
});
console.info('Goodbye cruel world!');
সিঙ্ক্রোনাস কখন doSomething
এটি মুদ্রণ করবে:
Hello, World!
Got result!
Goodbye cruel world!
বিপরীতে, যদি অ্যাসিনক্রোনাসdoSomething
হয় তবে এটি মুদ্রণ করবে:
Hello, World!
Goodbye cruel world!
Got result!
যেহেতু ফাংশনটি doSomething
এটি অবিচ্ছিন্নভাবে কাজ করছে, কাজ শেষ হওয়ার আগেই এটি ফিরে আসে। সুতরাং আমরা কেবল মুদ্রণের পরে ফলাফল পেতেGoodbye cruel world!
যদি আমরা একটি অ্যাসিঞ্চ কলের ফলাফলের উপর নির্ভর করে, আমাদের কলব্যাকের মধ্যে নির্ভরশীল কোডটি রাখা দরকার:
console.info('Hello, World!');
doSomething(function handleResult(result) {
console.info('Got result!');
if (result === 'good') {
console.info('I feel great!');
}
else {
console.info('Goodbye cruel world!');
}
});
তেমনি, কেবল 2 বা তিনটি জিনিস ক্রমযুক্ত হওয়া দরকার তা এগুলি সিঙ্ক্রোনিকভাবে করার কোনও কারণ নয় (যদিও সিঙ্ক কোডটি বেশিরভাগ লোকের সাথে কাজ করা সহজ)।
কেন সাইনক্রোনোনস এক্সএমএলএইচটিপিআরইকিউস্ট ব্যবহার করবেন?
কিছু পরিস্থিতিতে রয়েছে যেখানে ডাকা ফাংশনটি শেষ হওয়ার আগে আপনাকে ফলাফলের প্রয়োজন। এই পরিস্থিতিতে বিবেচনা করুন:
function lives(name) {
return (name !== 'Elvis');
}
console.info('Elvis ' + (lives('Elvis') ? 'lives!' : 'has left the building...');
মনে করুন কলিং কোড ( console.info
লাইন) এর উপরে আমাদের কোনও নিয়ন্ত্রণ নেই lives
এবং সার্ভারকে জিজ্ঞাসা করার জন্য আমাদের ফাংশনটি পরিবর্তন করতে হবে ... সার্ভারের মধ্যে আমরা কোনও এ্যাসিঙ্ক অনুরোধ করতে পারি না lives
এবং এখনও lives
সম্পূর্ণ হওয়ার আগে আমাদের প্রতিক্রিয়া রয়েছে । সুতরাং আমরা কিনা ফিরতে জানতাম না true
বাfalse
। ফাংশনটি শেষ হওয়ার আগে ফলাফল পাওয়ার একমাত্র উপায় হ'ল সিঙ্ক্রোনাস অনুরোধ করা।
Sami Samhuri
তাঁর উত্তরে যেমন উল্লেখ করা হয়েছে, এমন একটি বাস্তব পরিস্থিতি যেখানে আপনার ফাংশনটি শেষ হওয়ার আগে আপনার সার্ভারের অনুরোধের জবাব প্রয়োজন হতে পারে তা হ'ল onbeforeunload
এটি আপনার অ্যাপ্লিকেশন থেকে শেষ ফাংশন যা উইন্ডোটি বন্ধ হওয়ার আগে কখনও চলবে।
আমি সংযুক্তি কল করার দরকার নেই, তবে আমি তাদের যে কোনও উপায়েই সহজেই ব্যবহার করি
দয়া করে না। সিঙ্ক্রোনাস কলগুলি আপনার ব্রাউজারটিকে লক করে রাখে এবং অ্যাপটিকে প্রতিক্রিয়াহীন মনে করে। তবে আপনি ঠিক বলেছেন। অ্যাসিঙ্ক কোডটি আরও শক্ত। এটির সাথে কাজ করার উপায়টি আরও সহজ। সিঙ্ক কোডের মতো সহজ নয়, তবে এটি কাছে আসছে: প্রতিশ্রুতি এস।
এখানে একটি উদাহরণ রয়েছে: তৃতীয় বিভাগের কোডটি চলার আগে দুটি অ্যাসিঞ্চ কল দুটিই সাফল্যের সাথে শেষ করা উচিত:
var carRented = rentCar().then(function(car){
gasStation.refuel(car);
});
var hotelBooked = bookHotel().then(function(reservation) {
reservation.confirm();
});
Promise.all([carRented, hotelBooked]).then(function(){
// At this point our car is rented and our hotel booked.
goOnHoliday();
});
এখানে আপনি কীভাবে প্রয়োগ করবেন bookHotel
:
function bookHotel() {
return new Promise(function(resolve, reject){
if (roomsAvailable()) {
var reservation = reserveRoom();
resolve(reservation);
}
else {
reject(new Error('Could not book a reservation. No rooms available.'));
}
});
}
আরও দেখুন: প্রতিশ্রুতি সহ আরও ভাল জাভাস্ক্রিপ্ট লিখুন ।
XMLHttpRequest
traditionতিহ্যগতভাবে অ্যাসিনক্রোনাস অনুরোধগুলির জন্য ব্যবহৃত হয়। কখনও কখনও (ডিবাগিং, বা নির্দিষ্ট ব্যবসায়িক যুক্তির জন্য) আপনি এক পৃষ্ঠায় সমস্ত / বেশ কয়েকটি এসাইক কলগুলি সিঙ্ক করতে পরিবর্তন করতে চান।
আপনি আপনার জেএস কোডের সবকিছু পরিবর্তন না করে এটি করতে চান। অ্যাসিঙ্ক / সিঙ্ক পতাকাটি আপনাকে সেই ক্ষমতা দেয় এবং সঠিকভাবে নকশা করা হলে, আপনার কোডে কেবল একটি লাইন পরিবর্তন করতে হবে / var
সম্পাদনের সময় কোনওটির মান পরিবর্তন করতে হবে ।
ফায়ারফক্স (এবং সম্ভাব্য সমস্ত নন-আইই ব্রাউজারগুলি) অ্যাসিঙ্ক এক্সএইচআর টাইমআউট সমর্থন করে না।
এইচটিএমএল 5 ওয়েব ওয়ার্কার্স সময়সীমা সমর্থন করে। সুতরাং, আপনি সময়সীমা আচরণের সাথে অ্যাসিঙ্ক-এর মতো এক্সএইচআর বাস্তবায়নের জন্য টাইমআউট সহ ওয়েব ওয়ার্কারকে সিঙ্ক এক্সএইচআর অনুরোধটি মোড়তে চাইতে পারেন।
সিঙ্ক্রোনাস এইচটিটিপি অনুরোধগুলি ব্যবহার করা মোবাইল বিজ্ঞাপন ব্যবসায়ে একটি সাধারণ অভ্যাস।
অ্যাপ্লিকেশন তৈরি করা সংস্থাগুলি (ওরফে "প্রকাশক") প্রায়শই রাজস্ব আয় করতে বিজ্ঞাপন চালায়। এর জন্য তারা তাদের অ্যাপে বিজ্ঞাপন এসডিকে ইনস্টল করে। অনেকগুলি বিদ্যমান (মোপাব, ওগুরি, ট্যাপজব, অ্যাপনেক্সট, গুগল অ্যাডস অ্যাডমব)।
এই এসডিকে ওয়েব ভিউতে বিজ্ঞাপন দেওয়া হবে।
কোনও ব্যবহারকারীর কাছে বিজ্ঞাপন সরবরাহ করার সময়, এটি বিশেষত স্মুথ অভিজ্ঞতা হতে হবে কোনও ভিডিও প্লে করার সময়। কোনও মুহুর্তে কোনও বাফারিং বা লোড হওয়া উচিত নয়।
এটি সমাধান করার precaching
জন্য ব্যবহৃত হয়। যেখানে মিডিয়া (ছবি / ভিডিও / ইত্যাদি) ওয়েব ভিউয়ের পটভূমিতে সিঙ্ক্রোনজ লোড করা হয়।
কেন এটি তাত্পর্যপূর্ণ নয়?
onload
বিজ্ঞাপনটি কখন ব্যবহারকারীটির কাছে পরিবেশন করার জন্য "প্রস্তুত" হয় তা জানতে ইভেন্টটি শুনেছে SDএর থামিয়ে দেওয়া সঙ্গে সমলয় XMLHttpRequests , বিজ্ঞাপন ব্যবসা সম্ভবত ভবিষ্যতে মান পরিবর্তন করতে যদি না অন্য উপায় নির্ধারণ করা যেতে পারে বাধ্য করা হবে না।
সিঙ্ক্রোনাস এক্সএইচআর (অ-উত্পাদন) অভ্যন্তরীণ সরঞ্জাম এবং / অথবা কাঠামোর বিকাশের জন্য খুব কার্যকর হতে পারে। কল্পনা করুন, উদাহরণস্বরূপ, আপনি প্রথম অ্যাক্সেসে একটি কোড লাইব্রেরি সিঙ্ক্রোনলি লোড করতে চেয়েছিলেন, এটির মতো:
get draw()
{
if (!_draw)
{
let file;
switch(config.option)
{
case 'svg':
file = 'svgdraw.js';
break;
case 'canvas':
file = 'canvasdraw.js';
break;
default:
file = 'webgldraw.js';
}
var request = new XMLHttpRequest();
request.open('GET', file, false);
request.send(null);
_draw = eval(request.responseText);
}
return _draw;
}
আপনি নিজেকে ক্লিষ্ট হয়ে ওঠার আগে এবং অন্ধভাবে খারাপের পুনরায় সাজানোর আগে মনে রাখবেন যে এটি কেবল স্থানীয় পরীক্ষার জন্য। উত্পাদন বিল্ডগুলির জন্য, _ড্র ইতিমধ্যে সেট করা হবে।
সুতরাং, আপনার কোডটি দেখতে এইরকম হতে পারে:
foo.drawLib.draw.something(); //loaded on demand
এটি এমন কোনও কিছুর একটি উদাহরণ যা সিএনএইচআর সিঙ্ক ছাড়াই করা অসম্ভব। আপনি এই লাইব্রেরিটি সামনের দিকে লোড করতে পারেন, হ্যাঁ, বা কোনও প্রতিশ্রুতি / কলব্যাক করতে পারেন, তবে আপনি সিএইচআর সিঙ্ক ছাড়াই সিঙ্ক্রোনালি লাইব লোড করতে পারেন না। এই ধরণের জিনিসটি আপনার কোড পরিষ্কার করতে পারে তা নিয়ে ভাবুন ...
সরঞ্জামকরণ এবং ফ্রেমওয়ার্ক (স্থানীয়ভাবে চলমান) এর জন্য আপনি এটি দিয়ে কী করতে পারেন তার সীমাবদ্ধতা কেবলমাত্র আপনার কল্পনা দ্বারা সীমাবদ্ধ। যদিও, এটি জাভাস্ক্রিপ্ট বিশ্বে কল্পনা কিছুটা সীমাবদ্ধ বলে মনে হচ্ছে।
ভাল এখানে একটি ভাল কারণ। আমি তখন কোনও HTTP অনুরোধ করতে চেয়েছিলাম ফলাফলের উপর নির্ভর করে ইনপুট টাইপ = ফাইলটিতে কল ক্লিক () ( এটি অ্যাসিঙ্ক্রোনাস এক্সএইচআর বা আনার মাধ্যমে সম্ভব নয়। কলব্যাক প্রসঙ্গে "ব্যবহারকারী ক্রিয়া" হারায়, তাই কল ক্লিক () উপেক্ষা করা হবে। সিঙ্ক্রোনাস এক্সএইচআর আমার বেকন সংরক্ষণ করেছে।
onclick(event){
//here I can, but I don't want to.
//document.getElementById("myFileInput").click();
fetch("Validate.aspx", { method : "POST", body: formData, credentials: "include" })
.then((response)=>response.json())
.then(function (validResult) {
if (validResult.success) {
//here, I can't.
document.getElementById("myFileInput").click();
}
});
}