PDA

View Full Version : یک ایده برای هوشمندتر شدن کاربردهای ایجکسی



A B C D
سه شنبه 15 شهریور 1390, 10:41 صبح
بنده خیلی وقتا دیدم که لود شدن یه صفحه ای، حالا چه به روش کلاسیک و چه به روش ایجکس، مدت مدیدی طول میکشه و بعضی وقتا اصلا میشه گفت که ارتباط به یه نوعی قطع شده و هیچ پاسخی دریافت نخواهد شد، ولی کاربر ممکنه مدت زیادی منتظر بمونه و آخرش هم به هیچی نرسه. گاهی که اصلا بنظر میرسه یک ساعت هم منتظر بمونی تکلیف این لودینگ ها مشخص نمیشه و ظاهرا مرورگر هیچ Timeout ای هم نداره.

بنده یه ایده ای دارم که بنظرم میتونه مفید باشه و شکل ایجکسی این کاربردها رو هوشمندتر بکنه.

میتونیم برای درخواستهای ایجکس مورد نظر یک تایمر هم بذاریم و مثلا در برنامه تشخیص بدیم که پاسخ عملیات ایجکسی که در جریان هست بیش از حد به تاخیر افتاده (مثلا بعد از 30 ثانیه تکلیفش مشخص نشده و هنوز درحالت انتظار باقی مونده) و بعد اون درخواست قبلی رو Abort کنیم و یک درخواست جدید بفرستیم.

میتونیم این جریانات رو یه جوری به کاربر هم نشون بدیم. مثلا تصویر لودینگ متوقف بشه و دوباره استارت بشه و یه پیام موقت و کوتاه هم به شکلی نشون میدیم که کاربر رو متوجه میکنه که برنامه داره بصورت هوشمند چه کاری انجام میده (دوباره تلاش میکنه). البته احتمالا باید تعداد این تلاشها رو به تعداد مشخصی محدود کنیم و در نهایت اگر برنامه موفق به دریافت پاسخ نشد، Retry ها خاتمه یافته و یه پیام خطا داده بشه یا در محل مورد نظر بجای محتوایی که قرار بوده دریافت بشه درج بشه.

تنها چیزی که منو به شک وا میداره اینه که شاید این روش از بعضی نظرها اصولی نباشه، چون بصورت طبیعی ممکنه به عللی منجمله بار سنگین سرور، دریافت پاسخ خیلی زیادتر از حد معمول طول بکشه. البته فکر میکنم 30 ثانیه زمان قابل قبولی باشه.
ضمنا اینکه مرورگرها خودشون Timeout ندارن هم شک برانگیزه. ولی فکر میکنم بتونیم این مسئله رو با این دلیل توجیه بکنیم که تصمیم این امر بر عهدهء برنامه نویس هست که باید تشخیص بده عملیات مورد نظر از نظر ماهیت و اهمیت طوری هست که وجود یک Timeout براش مشکل ساز نباشه یا خیر. چون واقعا در بعضی موارد احتمالا نباید هیچ دخالتی کرد و سرخود درخواست مجدد فرستاد یا درخواست رو Abort کرد و این رفتار ممکنه سایدافکت های مضری داشته باشه.
ضمنا نمونه های کاربرد این روش رو در سایتها و نرم افزارهای معتبر زیاد ندیدم، اما فکر کنم یه جاهایی هم دیده باشم! دقیقا یادم نیست. حالا اینم خودش سواله که چرا کمتر سایتی این روش رو اعمال کرده. البته ممکنه این امر بخاطر سرعت و کیفیت بالاتر ارتباطات اینترنتی اونا بوده باشه که به ندرت دچار وضعیت ها و خطاهایی میشن که برای ما نامعمول نیستن.

eAmin
سه شنبه 15 شهریور 1390, 13:18 عصر
البته در Ajax مرورگر IE8+ پراپرتی بنام timeout برای xmlhttprequest قرار داده شده.
http://msdn.microsoft.com/en-us/library/cc534581(v=vs.85).aspx
همچنین دیدن این (http://ajaxblog.com/archives/2005/06/01/async-requests-over-an-unreliable-network)آدرس هم خالی از لطف نیست.

این روش اکثرا در تمامی فریم ورکهای معروف JavaScript پیاده سازی شده. mootools, jquery, prototypejs, dojo و...

mahan19
چهارشنبه 16 شهریور 1390, 00:28 صبح
به جاي time out ‌از statechange استفاده بشه بهتر نيست؟ طوري كه مرحله به مرحله ي انجام كار رو به كاربر نشون بديم، اونوقت خودش ميفهمه كجا داره بيش از حد طول ميكشه، دوباره درخواست ميكنه. ولي اگه از timeout استفاده بشه؟ ما كه سرعت اينترنت كاربر و ترافيك توي اون لحظه رو نميدونيم كه تايم اوت قرار بديم!!!!

A B C D
چهارشنبه 16 شهریور 1390, 00:52 صبح
کاربر که لزوما حرفه ای و فنی نیست و نمیخوایم زیاد درگیرش کنیم و ضمنا میخوایم کارها تاحدممکن خودکار باشه. مثلا شاید کاربر چنتا صفحه باز کرده و توی صفحهء دیگه هست یا اصلا اون قسمت در دید و تمرکزش نیست؛ میخوایم در این اثنا حتی الامکان کارهای مفیدی انجام بشه.

البته حالا به جزییاتش زیاد کار نداریم. فقط میخواستم بگم باید این موارد رو درنظر بگیریم و براشون تمهیداتی بکنیم. اگر بنظر شما واقعا اون شکل بهتره خب اون شکلی درست کنید.

مشکل از اونجا ناشی میشه که کارهای تست و طراحی روی لوکال انجام میشه و مطابق شرایط واقعی نیست. باید خطاها و شرایط معمول هندل بشن. حتی اگر طرف ADSL داره باید با دایالاپ هم کدی رو که نوشته تست کنه.

mahan19
چهارشنبه 16 شهریور 1390, 01:45 صبح
من ميگم شايد يك كاربر سرعتش پايين تر از حد متوسطي كه شما براي تايم اوت در نظر ميگيرين باشه ،براي همين تا مياد كاري انجام بشه دستورات تايم اوت كه شما تعريف كردين اجرا ميشه،و همينطور بازم تايم اوت.... تا اينكه عملا هيچ كاري انجام نميشه!
منظور من اين نبود كه كاربر حتما بايد فني باشه يا ما به زبان بر نامه نويسي باهاش صحبت كنيم!! ميتونيم با پيغام هاي ساده راهنماييش كنيم.مثل:
در حال ارتباط با سرور..........ارتباط برقرار شد..........درحال بررسي نام كاربري...................................... .ارتباط با سرور قطع شد(توضيحات)-لطفا مجددا تلاش كنيد.
درحال ارتباط...............ارتباط برقرار شد........در حال بررسي...............نام كاربري صحيح ميباشد.