অ্যাঙ্গুলারজেএস-এ al evalAsync এবং $ সময়সীমার মধ্যে পার্থক্য কী?


180

আমি এখন অল্প সময়ের জন্য অ্যাংুলারজেএস ব্যবহার করছি এবং একবারে একবারে $ টাইমআউট ব্যবহার করার প্রয়োজনীয়তাটি খুঁজে পেয়েছি (সাধারণত একটি jQuery প্লাগইন শুরু করা লাগে)।

সম্প্রতি, আমি ডাইজেস্ট চক্র সম্পর্কে আরও ভাল এবং আরও গভীরতর বোঝার চেষ্টা করছি এবং আমি $ evalAsync ফাংশনটি দেখতে পেয়েছি

দেখে মনে হচ্ছে যে ফাংশনটি একইরকম ফলাফল তৈরি করে $timeout, কেবল আপনি এটি বিলম্ব করবেন না। যতবারই আমি এটি ব্যবহার করেছি $timeout0 দেরীতে হয়েছে তাই এখন আমি ভাবছি এর $evalAsyncপরিবর্তে আমার কী ব্যবহার করা উচিত ছিল ।

দুজনের মধ্যে কি কোনও মৌলিক পার্থক্য রয়েছে? কোনটি ক্ষেত্রে আপনি একে অপরকে ব্যবহার করবেন? কখন কোনটি ব্যবহার করব সে সম্পর্কে আমি আরও ভাল অনুভূতি পেতে চাই।

উত্তর:


263

আমি সম্প্রতি মূলত এই প্রশ্নের উত্তর এখানে দিয়েছি: https://stackoverflow.com/a/17239084/215945 (এই উত্তরটি মিস্কোর সাথে কিছু গিথুব এক্সচেঞ্জের লিঙ্ক।

সংক্ষেপ:

  • যদি কোনও নির্দেশিকা থেকে evalAsync ব্যবহার করে কোডটি সারি করা হয় , তবে এটি অ্যাংুলার দ্বারা ডিওএমকে চালিত করার পরে চালানো উচিত , তবে ব্রাউজারটি রেন্ডার করার আগে
  • যদি কোনও নিয়ামকের কাছ থেকে কোডটি $ evalAsync ব্যবহার করে সারিবদ্ধ হয়, তবে ডিওএমটি অ্যাংুলার দ্বারা চালিত হওয়ার আগে চালানো উচিত (এবং ব্রাউজারটি রেন্ডার করার আগে) - আপনি খুব কমই চান
  • যদি কোডটি $ টাইমআউট ব্যবহার করে সারিবদ্ধ করা হয় , তবে এটি ডিওএম অ্যাংুলার দ্বারা চালিত হওয়ার পরে এবং ব্রাউজারের রেন্ডারের পরে চালানো উচিত (যা কিছু ক্ষেত্রে ঝাঁকুনির কারণ হতে পারে)

15
ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ. একটি জিনিস আমি নিশ্চিত যদিও আমি বুঝতে পারি না। আপনি যদি কোনও নিয়ামক বা নির্দেশকের কাছ থেকে al evalAsync কল করেন তবে কেন এটির পার্থক্য রয়েছে? AsyncQueue জানে না এটি কোনও নিয়ামক থেকে নিবন্ধিত হয়েছে বা কোনও নির্দেশিকা থেকে, এটি কেবল বর্তমান স্কোপেই সারি রেখেছে। যখন নিয়ন্ত্রণগুলি বনাম একটি নিয়ামক হিসাবে স্টাফগুলি চালিত হয় তখন এর সাথে কী করতে হবে? আমি কেবল সেই অংশটি বুঝতে চাই।
ডিএনসি 253

@ dnc253, আমি কৌণিক কোডটির দিকে নজর দিইনি, সুতরাং আপনার (ভাল) প্রশ্নের উত্তর আমি জানি না। আশা করি অন্য কেউ মন্তব্য করতে পারেন।
রাজকোক

15
"নির্দেশিকা থেকে সংযুক্ত ফাংশন থেকে" কোনও নির্দেশিকা থেকে "মানে" কি? বা নির্দেশের লিঙ্ক বা নিয়ামক পদ্ধতি থেকে কার্যকর করা হলে আচরণের ক্ষেত্রে এটিই সত্য?
সিম্পলজি

5
হাঁ, এটা সত্যিই অস্পষ্ট কি এবং "একটি নিয়ামক থেকে" "একটি নির্দেশ থেকে" এখানে মানে
কাঁটা

1
@ মারকরাজাকোক, আপনি কি এখানে দয়া করে পরিষ্কার করতে পারেন: কোডটি যদি কোনও নির্দেশিকা থেকে al evalAsync ব্যবহার করে সারি করা হয়, তবে এটি ডিওএম অ্যাঙ্গুলার দ্বারা চালিত হওয়ার পরে চালানো উচিত - এই নির্দেশটি দ্বারা ডিওএমকে চালিত করার পরে এটি চালানো উচিত, বা অন্য নির্দেশাবলী দ্বারা?
ম্যাক্স কোরেটস্কি

59

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

  • $ সময়সীমা (কলব্যাক) বর্তমান ডাইজেস্ট চক্রটি সম্পন্ন হওয়ার জন্য অপেক্ষা করবে (অর্থাত কৌণিক আপডেট সমস্ত মডেল এবং ডিওএম), তারপরে এটি তার $applyকলব্যাকটি সম্পাদন করবে - সম্ভাব্য কৌণিক মডেলকে প্রভাবিত করবে - তারপরে মূল $ স্কোপটিতে একটি পূর্ণ প্রবর্তন করবে , এবং পুনর্নির্মাণ করবে সবকিছু।

  • $ অন্যদিকে, evalAsync (কলব্যাক) বর্তমান বা পরবর্তী ডাইজেস্ট চক্রটিতে কলব্যাক যোগ করবে। যার অর্থ যদি আপনি ডাইজেস্ট চক্রের মধ্যে থাকেন (উদাহরণস্বরূপ কোনও ng-clickনির্দেশিকা থেকে ডাকা কোনও ফাংশনে ), এটি কোনও কিছুর জন্য অপেক্ষা করবে না, কোডটি এখনই কার্যকর করা হবে। আপনি যদি অ্যাসিক্রোনাস কলের মধ্যে থাকেন তবে উদাহরণস্বরূপ একটি setTimeout, একটি নতুন ডাইজেস্ট চক্র ( $apply) ট্রিগার করা হবে।

সুতরাং পারফরম্যান্সের ক্ষেত্রে কল করা সর্বদা ভাল $evalAsync, যদি না আপনার কোডটি কার্যকর করার আগে ভিউটি আপ টু ডেট থাকে, উদাহরণস্বরূপ যদি আপনাকে কিছু ডিওএম বৈশিষ্ট্যে যেমন অ্যালিমেন্টের প্রস্থ এবং এর মতো অ্যাকসেসের প্রয়োজন হয়।

যদি আপনি $ টাইমআউট, $ ইভালএেন্সেক, $ ডাইজেস্ট, $ প্রয়োগের মধ্যে পার্থক্য সম্পর্কে আরও বিশদ জানতে চান তবে আমি আপনাকে অন্য প্রশ্নটিতে আমার উত্তরটি পড়তে আমন্ত্রণ জানাচ্ছি: https://stackoverflow.com/a/23102223/1501926

ডকুমেন্টেশন পড়তে ভুলবেন না :

$ EvalAsync কখন এক্সপ্রেশনটি কার্যকর করা হবে তার কোনও গ্যারান্টি দেয় না, কেবলমাত্র:

  • এটি মূল্যায়ন নির্ধারিত ফাংশনটির পরে কার্যকর করা হবে (সাধারণত ডম রেন্ডারিংয়ের আগে)।
  • কমপক্ষে একটি $ ডাইজেস্ট চক্রটি এক্সপ্রেশন কার্যকর করার পরে সঞ্চালিত হবে।

দ্রষ্টব্য: যদি এই ফাংশনটিকে $ ডাইজেস্ট চক্রের বাইরে বলা হয় তবে একটি নতুন $ ডাইজেস্ট চক্র নির্ধারিত হবে । যাইহোক, সর্বদা কোড কল করতে উত্সাহিত করা হয় যা $ প্রয়োগ কলের মধ্যে থেকে মডেলটিকে পরিবর্তন করে। এর মধ্যে $ evalAsync- এর মাধ্যমে মূল্যায়নকৃত কোড অন্তর্ভুক্ত রয়েছে।


আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে আমাকে যদি কিছু ডিওএম বৈশিষ্ট্য অ্যাক্সেস করার প্রয়োজন হয় তবে কেন $ টাইমআউট দরকার। ধরা যাক যদি আমার <টেবিল প্রস্থ = "{{x}}"> এনজি-বাইন্ডের ঘড়ির ক্রিয়াকলাপটি স্মৃতিতে ডোম বৈশিষ্ট্যটি আপডেট করে না, আমি বুঝতে পেরেছি যে ডাইজেস্ট চক্রটি প্রস্থান না হওয়া অবধি এই দৃশ্যটি পুনরায় রঙ করার সুযোগ পাবে না।
শ্রীধর চিদুরালা

2
@ শ্রীধর চিদুরালা হজম চক্র চলাকালীন DOM ("এইচটিএমএল") আপডেট হওয়ার কারণে, আপনি মুভিফিকেশনগুলি পড়ার আগে এটি সম্পন্ন হওয়ার জন্য আপনাকে অপেক্ষা করতে হবে। তবে এটি কৌণিক দ্বারা নিরুৎসাহিত করা হয়, xআপনার নিজের স্কোপ থেকে ডম এর চেয়ে সরাসরি পড়া উচিত , সুতরাং আপনাকে কোনও কিছুর জন্য অপেক্ষা করতে হবে না। এছাড়াও, আপনার ng-styleঅপ্রচলিত widthসম্পত্তির চেয়ে সিএসএস দিয়ে আরও ভাল ব্যবহার করা উচিত । আপনার যদি আরও সহায়তার প্রয়োজন হয় তবে দয়া করে স্ট্যাকওভারফ্লোতে একটি নতুন প্রশ্ন খুলুন।
ফ্লুরিবোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.