আপডেট 10/9/2013: রান লুপটির এই ইন্টারেক্টিভ ভিজুয়ালাইজেশনটি দেখুন: https://machty.s3.amazonaws.com/ember-run-loop-visual/index.html
5/9/2013 আপডেট করুন: নীচের সমস্ত মৌলিক ধারণাটি এখনও আপ টু ডেট, তবে এই প্রতিশ্রুতি অনুসারে , অ্যাম্বার রান লুপ বাস্তবায়নটি খুব সামান্য এপিআই পার্থক্য সহ ব্যাকবার্ন.জেস নামে একটি পৃথক গ্রন্থাগারে বিভক্ত হয়েছে ।
প্রথমে এইগুলি পড়ুন:
http://blog.sproutcore.com/the-run-loop-part-1/
http://blog.sproutcore.com/the-run-loop-part-2/
এ্যাম্বারের কাছে এগুলি 100% সঠিক নয়, তবে রানলুপের পিছনে মূল ধারণাগুলি এবং অনুপ্রেরণাগুলি এখনও অ্যাম্বারে সাধারণত প্রয়োগ হয়; শুধুমাত্র কিছু বাস্তবায়ন বিবরণ পৃথক। তবে, আপনার প্রশ্নগুলি:
এম্বার রানলুপ কখন শুরু হবে? এটি রাউটার বা ভিউ বা নিয়ন্ত্রণ বা অন্য কোনও কিছুর উপর নির্ভরশীল?
সমস্ত বুনিয়াদি ব্যবহারকারীর ইভেন্টগুলি (যেমন কীবোর্ড ইভেন্টস, মাউস ইভেন্টগুলি ইত্যাদি) রান লুপটি জ্বালিয়ে দেবে। এটি গ্যারান্টি দেয় যে বন্দী হওয়া (মাউস / কীবোর্ড / টাইমার / ইত্যাদি) ইভেন্টের দ্বারা আবদ্ধ বৈশিষ্ট্যগুলিতে যে কোনও পরিবর্তন ঘটানো হয়েছে তা পুরোপুরি সিস্টেমে নিয়ন্ত্রণ ফিরিয়ে দেওয়ার আগে অ্যাম্বারের ডেটা-বন্ডিং সিস্টেম জুড়ে পুরোপুরি প্রচারিত। সুতরাং, আপনার মাউসটি সরানো, একটি কী টিপুন, একটি বোতামে ক্লিক করা ইত্যাদি, সমস্ত রান লুপ চালু করে।
এটি প্রায় কতক্ষণ সময় নেয় (আমি জানি এটি জিজ্ঞাসা করা বরং অনেক কিছুর উপর নির্ভরশীল বুদ্ধিযুক্ত তবে আমি একটি সাধারণ ধারণা খুঁজছি, অথবা যদি কোনও রানওলুপ নিতে পারে সর্বনিম্ন বা সর্বাধিক সময় নিতে পারে)
সিস্টেমের মাধ্যমে সমস্ত পরিবর্তনগুলি প্রচার করতে এবং তারপরে সর্বাধিক সময়সীমার সীমা পৌঁছানোর পরে রানলুপটি থামিয়ে দিতে কত সময় লাগছে তা কোনও সময় রানঅলুপ কখনই রাখে না; বরং রানলুপ সর্বদা সমাপ্তির দিকে চালিত হবে এবং সমস্ত মেয়াদোত্তীর্ণ টাইমার না ডেকে, বাইন্ডিংগুলি প্রচারিত করা এবং সম্ভবত তাদের বাইন্ডিংগুলি প্রচার করা ইত্যাদি এগুলি থামবে না । স্পষ্টতই, একক ইভেন্ট থেকে যত বেশি পরিবর্তন প্রচার করা দরকার, রান লুপ শেষ হতে তত বেশি সময় লাগবে। রান লুপ কীভাবে রান লুপ না থাকা অন্য ফ্রেমওয়ার্ক (ব্যাকবোন) এর সাথে তুলনা করে পরিবর্তনগুলি প্রচার করতে শুরু করতে পারে তার একটি উদাহরণ (বেশ অন্যায্য) উদাহরণ: http://jsfiddle.net/jashkenas/CGSd5/। গল্পটির নৈতিকতা: এম্বারে আপনি যা করতে চান তার বেশিরভাগ কাজের জন্য রানলুপ সত্যিই দ্রুত এবং এটি যেখানে এম্বারের শক্তি অনেকাংশেই রয়েছে, তবে আপনি যদি প্রতি সেকেন্ডে 60 ফ্রেমে জাভাস্ক্রিপ্টের সাথে 30 টি বৃত্ত অ্যানিমেট করতে চান, তবে এটি রবার লুপের উপর নির্ভর করার চেয়ে ভাল উপায় হতে পারে।
রানলুপ কি সর্বদা মৃত্যুদন্ড কার্যকর করা হচ্ছে, বা এটি কেবল মৃত্যুদন্ড কার্যকর করার শুরু থেকে শেষের সময়কালের ইঙ্গিত দিচ্ছে এবং কিছু সময়ের জন্য এটি চলতে পারে না।
এটি সর্বদা কার্যকর করা হয় না - এটি কোনও সময়ে সিস্টেমে নিয়ন্ত্রণ ফিরিয়ে আনতে পারে অন্যথায় আপনার অ্যাপ্লিকেশনটি স্তব্ধ হয়ে যায় - এটি কোনও সার্ভারের একটি রান লুপ থেকে আলাদা while(true)
এবং বলা যায় যে অবধি অনন্ততা অবধি চলে সার্ভারটি শাট ডাউন করার জন্য একটি সংকেত পেয়েছে ... অ্যাম্বার রানলুপের তেমন কোনও নেই while(true)
তবে এটি কেবল ব্যবহারকারী / টাইমার ইভেন্টের প্রতিক্রিয়া হিসাবে সজ্জিত ।
যদি কোনও রানলুপের মধ্যে থেকে কোনও দৃশ্য তৈরি করা হয়, তবে এটির নিশ্চয়তা কি লুপটি শেষ হওয়ার সাথে সাথে এর সমস্ত সামগ্রী এটি ডিওমে পরিণত করবে?
আসুন আমরা এটি বের করতে পারি কিনা তা দেখুন। এসসি থেকে এম্বার রানলুপে বড় পরিবর্তনগুলির মধ্যে একটি হ'ল এবং এর মধ্যে invokeOnce
এবং পিছনে পিছনে লুপিংয়ের পরিবর্তে invokeLast
(যা আপনি স্প্রাউটকোরের আরএল সম্পর্কে প্রথম লিঙ্কটিতে চিত্রটিতে দেখেন), এম্বার আপনাকে 'সারি'র একটি তালিকা সরবরাহ করে যা, একটি রান লুপ অবশ্যই, আপনি ক্রিয়া (রান লুপ চলাকালীন কল করা ফাংশন) নির্ধারণ করে ক্রিয়াটি কোন সারিটির মধ্যে রয়েছে তা উল্লেখ করে (উদাহরণ থেকে উত্স Ember.run.scheduleOnce('render', bindView, 'rerender');
:)।
আপনি তাকান তাহলে run_loop.js
সোর্স কোডে, আপনি দেখতে Ember.run.queues = ['sync', 'actions', 'destroy', 'timers'];
এখনো যদি আপনি একটি জ্বলন্ত আগুন অ্যাপ্লিকেশানে ব্রাউজারে আপনার JavaScript ডিবাগার খুলুন এবং মূল্যায়ন, Ember.run.queues
, আপনি লাইনে দাঁড়িয়ে থাকতো একটি পূর্ণাঙ্গ তালিকা পাবেন: ["sync", "actions", "render", "afterRender", "destroy", "timers"]
। এম্বার তাদের কোডবেসকে বেশ মডুলার করে রাখে এবং আপনার কোড, সেইসাথে লাইব্রেরির একটি পৃথক অংশে আরও কোড সন্নিবেশ করানোর জন্য এটি সম্ভব করে তোলে। এই ক্ষেত্রে, অ্যাম্বার ভিউস লাইব্রেরি সন্নিবেশ করে render
এবং afterRender
সারিগুলি বিশেষত actions
সারি পরে । কেন আমি এক সেকেন্ড হতে পারে তা পেয়ে যাব। প্রথমত, রানলুপ আলগোরিদিম:
রানলুপ আলগোরিদিম উপরের এসসি রান লুপ নিবন্ধগুলিতে বর্ণিত হিসাবে অনেকটা একই:
- আপনি নিজের কোড রানলুপের মধ্যে চালান
.begin()
এবং .end()
কেবল অ্যাম্বারে আপনি তার পরিবর্তে আপনার কোডটি Ember.run
অভ্যন্তরীণভাবে কল করতে চান begin
এবং আপনার end
জন্য কল করতে চান। (এম্বার কোড বেসে কেবলমাত্র অভ্যন্তরীণ রান লুপ কোডটি এখনও ব্যবহার করে begin
এবং end
তাই আপনার কেবল এটির সাথে থাকা উচিত Ember.run
)
- এর পরে
end()
ডাকা হয়, রানলুপ তারপরে গিয়ারে কিক করে দেয় যা ফাংশনটিতে পাস হওয়া কোডগুলির দ্বারা তৈরি প্রতিটি পরিবর্তনকে প্রচার করে Ember.run
। এর মধ্যে আবদ্ধ বৈশিষ্ট্যগুলির মানগুলি প্রচার করা, ডিওমে পরিবর্তনের দৃশ্য পরিবর্তন ইত্যাদি includes ইত্যাদি অন্তর্ভুক্ত রয়েছে these Ember.run.queues
উপরোক্ত বর্ণিত অ্যারে অনুসারে এই ক্রিয়াগুলি (বন্ডিং, রেন্ডারিং ডিওএম উপাদানগুলি ইত্যাদি) যে ক্রমে সম্পাদিত হয় তা নির্ধারণ করা হয় :
- রান লুপটি প্রথম কাতারে শুরু হবে, যা
sync
। এটি কোডের মাধ্যমে sync
কাতারে নির্ধারিত সমস্ত ক্রিয়া চালাবে Ember.run
। এই ক্রিয়াগুলি নিজেই এই একই রানলুপ চলাকালীন আরও ক্রিয়াকলাপ নির্ধারণ করতে পারে এবং সমস্ত সারি স্রোত না হওয়া পর্যন্ত এটি প্রতিটি ক্রিয়া সম্পাদন করে তা নিশ্চিত করার জন্য এটি রানলুপের উপর নির্ভর করে। এটি যেভাবে এটি করে তা হ'ল প্রতিটি সারির শেষে, রানলুপ পূর্ববর্তী সমস্ত ফ্ল্যাশ করা সারিতে সন্ধান করবে এবং দেখুন যে কোনও নতুন ক্রিয়া নির্ধারিত হয়েছে কিনা। যদি তা হয় তবে এটি অপ্রত্যাশিত তফসিলযুক্ত ক্রিয়াসমূহের সাথে প্রথম সারির শুরুতে শুরু করতে হবে এবং সারিটি সরিয়ে ফেলতে হবে, তার ধাপগুলি সন্ধান করতে হবে এবং প্রয়োজনীয় সমস্ত প্রয়োজন সীমাটি সম্পূর্ণ খালি না হওয়া পর্যন্ত শুরু করা উচিত।
এটাই অ্যালগরিদমের সারমর্ম। এভাবেই অ্যাপের মাধ্যমে সীমাবদ্ধ ডেটা প্রচারিত হয় ated আপনি আশা করতে পারেন যে একবার রানলুপ শেষ হয়ে গেলে, সমস্ত আবদ্ধ ডেটা পুরোপুরি প্রচার করা হবে। সুতরাং, ডিওএম উপাদানগুলির কী হবে?
এম্বার ভিউস লাইব্রেরি দ্বারা যুক্ত করা কিউগুলি সহ ক্রমের ক্রমটি এখানে গুরুত্বপূর্ণ। লক্ষ্য করুন render
এবং afterRender
পরে আসুন sync
, এবং action
। sync
কিউ বাউন্ড তথ্য প্রচারের সমস্ত ক্রিয়া রয়েছে। (এর action
পরে, কেবল অ্যাম্বার উত্সে খুব কম ব্যবহৃত হয়)। উপরের অ্যালগরিদমের উপর ভিত্তি করে, এটি গ্যারান্টিযুক্ত যে রানলুপটি কাতারে পৌঁছানোর পরে render
সমস্ত ডেটা-বাইন্ডিংগুলি সমলয়করণ শেষ করবে। এটি ডিজাইনের মাধ্যমে: আপনি আগে ডম উপাদান সরবরাহ করার ব্যয়বহুল কাজটি সম্পাদন করতে চাইবেন নাডেটা-বাইন্ডিংগুলি সিঙ্ক করে নেওয়া, যেহেতু এর জন্য সম্ভবত আপডেট হওয়া ডেটা সহ ডিওএম উপাদানগুলি পুনরায় রেন্ডারিংয়ের প্রয়োজন হবে - সম্ভবত রানলুপ সারিগুলি খালি করার জন্য খুব অদক্ষ এবং ত্রুটি-প্রবণ উপায়। সুতরাং এম্বার বুদ্ধিমানভাবে render
কাতারে ডিওএম উপাদানগুলি সরবরাহ করার আগে এটি করতে পারে এমন সমস্ত ডেটা-বাঁধাইয়ের কাজকর্মের মাধ্যমে বিস্ফোরণ ঘটায় ।
সুতরাং, অবশেষে, আপনার প্রশ্নের উত্তর দেওয়ার জন্য, হ্যাঁ, আপনি আশা করতে পারেন যে কোনও প্রয়োজনীয় ডোম রেন্ডারিংগুলি সময় Ember.run
শেষ হওয়ার সাথে সাথে হয়ে গেছে। এখানে প্রদর্শনের জন্য একটি জেএসফিডাল: http://jsfiddle.net/machty/6p6XJ/328/
রানলুপ সম্পর্কে জানার জন্য অন্যান্য জিনিস
পর্যবেক্ষক বনাম বাঁধাই
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে পর্যবেক্ষক এবং বাইন্ডিংস, "দেখা" সম্পত্তিতে পরিবর্তনের ক্ষেত্রে সাড়া দেওয়ার মতো কার্যকারিতা রাখার পরেও রানলুপের প্রসঙ্গে সম্পূর্ণ ভিন্ন আচরণ করে। বাইন্ডিং প্রচার, যেমন আমরা দেখেছি, sync
শেষ পর্যন্ত রানলুপ দ্বারা সম্পাদন করার জন্য সারিতে নির্ধারিত হয়ে যায় । অন্যদিকে পর্যবেক্ষকরা প্রথমে রানলুপ সারিতে নির্ধারিত না হয়ে দেখা প্রপার্টি পরিবর্তিত হলে অবিলম্বে গুলি চালায়। যদি কোনও পর্যবেক্ষক এবং একটি বাধ্যতামূলক সমস্ত একই সম্পত্তি "নজর রাখেন", তবে বাইন্ডিং আপডেট হওয়ার আগে পর্যবেক্ষককে সর্বদা 100% আগে বলা হবে।
scheduleOnce
এবং Ember.run.once
অ্যাম্বারের অটো-আপডেটিং টেম্পলেটগুলির মধ্যে অন্যতম বৃহত দক্ষতা বৃদ্ধি করা এই সত্যটির উপর ভিত্তি করে যে, রানলুপকে ধন্যবাদ জানায়, একাধিক অভিন্ন রানলুপ ক্রিয়াকলাপগুলি ("যদি আপনি চান তবে") একক ক্রিয়ায় জড়িত হতে পারে। আপনি মধ্যে চেহারা যদি run_loop.js
অভ্যন্তরীণ, আপনি ফাংশন যে এই আচরণ সহজতর সংশ্লিষ্ট ফাংশন দেখতে পাবেন scheduleOnce
এবং Em.run.once
। তাদের মধ্যে পার্থক্য এতটা গুরুত্বপূর্ণ নয় যে তারা বিদ্যমান রয়েছে তা জেনে রাখা, এবং রান লুপ চলাকালীন প্রচুর ফোলা, অপব্যয়হীন গণনা রোধ করতে কীভাবে তারা সারিতে সদৃশ ক্রিয়াগুলি ফেলে দিতে পারে।
টাইমারদের কী হবে?
যদিও 'টাইমার' উপরে তালিকাভুক্ত ডিফল্ট সারিগুলির মধ্যে একটি, তবুও এম্বার তাদের রানলুপ পরীক্ষার ক্ষেত্রে কেবল সারিটির রেফারেন্স দেয়। মনে হচ্ছে টাইমারগুলি আগুনের সর্বশেষ জিনিস হওয়ার বিষয়ে উপরের নিবন্ধগুলির কিছু বর্ণনার ভিত্তিতে স্প্রিটকোর দিনগুলিতে এই জাতীয় একটি সারি ব্যবহৃত হত। এম্বারে, সারিটি timers
ব্যবহৃত হয় না। পরিবর্তে, রানলুপ একটি অভ্যন্তরীণভাবে পরিচালিত setTimeout
ইভেন্ট ( invokeLaterTimers
ফাংশনটি দেখুন) দ্বারা সজ্জিত হতে পারে , যা বিদ্যমান বিদ্যমান টাইমারগুলির মধ্য দিয়ে লুপ করতে যথেষ্ট বুদ্ধিমান, মেয়াদ শেষ হয়ে গেছে এমন সমস্তগুলিকে গুলি করে, ভবিষ্যতের আদি টাইমার নির্ধারণ করে এবং একটি অভ্যন্তরীণ সেট করেsetTimeout
কেবলমাত্র সেই ইভেন্টের জন্য, এটি যখন জ্বলতে থাকে তখন রানলুপটি আবার স্পিন করবে। প্রতিটি টাইমার কল সেটটাইমআউট এবং নিজেকে জাগ্রত করার চেয়ে এই পদ্ধতিটি আরও কার্যকর, যেহেতু এই ক্ষেত্রে কেবলমাত্র একটি সেটটাইমআউট কল করা দরকার, এবং রানলুপ একই সাথে বন্ধ হয়ে যাওয়া বিভিন্ন টাইমারকে চালিত করার জন্য যথেষ্ট স্মার্ট that সময়
sync
সারি দিয়ে আরও বিতর্ক করা হচ্ছে
রান লুপের সমস্ত সারি পেরিয়ে একটি লুপের মাঝখানে রান রান থেকে একটি স্নিপেট এখানে। sync
কিউর জন্য বিশেষ কেসটি নোট করুন : কারণ sync
এটি একটি বিশেষত অস্থির কাত, যেখানে প্রতিটি দিক থেকে তথ্য প্রচার করা হচ্ছে, Ember.beginPropertyChanges()
কোনও পর্যবেক্ষককে বরখাস্ত হতে বাধা দেওয়ার জন্য ডাকা হয়, তারপরে একটি কল করা হয় Ember.endPropertyChanges
। এটি বুদ্ধিমান: কাতাকে ফ্লাশ করার ক্ষেত্রে যদি sync
এটি সম্পূর্ণভাবে সম্ভব হয় যে কোনও বস্তুর সম্পত্তি তার চূড়ান্ত মানটির উপর নির্ভর করার আগে একাধিকবার পরিবর্তিত হয় এবং আপনি প্রতি একক পরিবর্তনের সাথে সাথে পর্যবেক্ষককে তাত্ক্ষণিক গুলি চালিয়ে সংস্থানগুলি নষ্ট করতে চান না ।
if (queueName === 'sync')
{
log = Ember.LOG_BINDINGS;
if (log)
{
Ember.Logger.log('Begin: Flush Sync Queue');
}
Ember.beginPropertyChanges();
Ember.tryFinally(tryable, Ember.endPropertyChanges);
if (log)
{
Ember.Logger.log('End: Flush Sync Queue');
}
}
else
{
forEach.call(queue, iter);
}
আশাকরি এটা সাহায্য করবে. আমি অবশ্যই এই জিনিসটি লেখার জন্য বেশ কিছুটা শিখতে হয়েছিল, যা ছিল বিন্দু ধরনের।