PDA

View Full Version : حرفه ای: مشکل هنگ کردن در هنگام استفاده از Ajax



abpsoft
سه شنبه 28 خرداد 1392, 10:17 صبح
سلام دوستان

من وقتی از Ajax استفاده می کنم که بتونم اطلاعاتی رو به سمت سرور بفرستم، یه مشکلی دارم.
وقتی که async: false قرار می دم، تا وقتی که نتیجه از سمت سرور به سمت کلاینت ارسال نشه، مرورگر هنگ می کنه و هیچ کدی اجرا نمیشه.

توی سایت های خارجی هم دنبالش گشتم. ولی چیزی پیدا نکردم.

توجه کنید که از Jquery نمی خوام برای آجاکس خودم استفاده کنم. میخوام توسط تابعی که خودم مینوسم از Ajax استفاده کنم و با Jquery کار نمی کنم.

ممنون می شم اگه کسی بتونه راهنمایی کنه.

tamafi6
سه شنبه 28 خرداد 1392, 15:08 عصر
دوست من ازلينوكس براي ارتباط استفاده ميكنيد?
اطلاعات براي چه كاري ارسال ودريافت ميشه?
Cpuسرورراچك كن
بعدازهنگ كردن چطوري رفع ميشه سرورراريستارت ميكنيدياخودش رفع ميشه ?
مشخصات سرورتون چي هست?
بيشترتوضيح بديد

abpsoft
سه شنبه 28 خرداد 1392, 16:49 عصر
سورس سمت سرور من PHP هستش.
فرقی نمی کنه که چه اطلاعاتی ارسال میشه. چه بخوام محتویات یه Textbox رو ارسال کنم یا چندین Textbox و ... .

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

دلیلش رو هم می دونم که بخاطر اینه که پارامتر سوم open در Ajax رو false قرار دادم. یعنی خودم می خوام false باشه که بتونم اون کاری رو که می خوام رو انجام بدم.

اگه کدش رو هم بخواید می نویسمش.

ممنون

tamafi6
سه شنبه 28 خرداد 1392, 21:25 عصر
من حدس ميزنم براي نظرسنجي سايت ميخواهيد من زيادباآجاكس آشنايي ندارم ولي باشبكه زيادكاركردم اين اتفاق زيادبرام پيش مياد يه احتمال ميدم اينه كه زبان سمت سرورباكلاينت مچ نيست يعني سرورچندلحظه سردرگم ميشه وبه cpu ‎فشارمياره سرورازاونورهنگ ميكنه

abpsoft
سه شنبه 28 خرداد 1392, 21:41 عصر
نه. مشکل اصلاً از سمت سرور نیست.
فکر کنم باید راهی پیدا کنیم که بتونیم از multi thread در جاوا اسکریپت استفاده کنیم.

سمت سرور اصلاً نیست.

cups_of_java
سه شنبه 28 خرداد 1392, 22:15 عصر
جاوا اسکریپت thread نداره، همه چی در یک thread اجرا میشه و طبیعی هست که وقتی شما به طور سنکرون (با async false) ای جکس میزنید، کد بلوک میشه تا نتیجه برگرده!

Mohsen.
سه شنبه 28 خرداد 1392, 22:16 عصر
من خودم تا به حال از خود JavaScript برای ajax استفاده نکردم. اما از jQuery خیلی زیاد در این رابطه استفاده کردم و به مشکل هم برنخوردم. به شما هم توصیه میکنم. حجمش 100 کیلو هم نیست.

abpsoft
سه شنبه 28 خرداد 1392, 22:18 عصر
جاوا اسکریپت thread نداره، همه چی در یک thread اجرا میشه و طبیعی هست که وقتی شما به طور سنکرون (با async false) ای جکس میزنید، کد بلوک میشه تا نتیجه برگرده!

خب پس به نظر شما باید چیکار کنیم؟
نمیشه async رو false بزاریم و کاری کنیم که کدهای دیگه هم اجرا بشه؟

abpsoft
سه شنبه 28 خرداد 1392, 22:21 عصر
من خودم تا به حال از خود JavaScript برای ajax استفاده نکردم. اما از jQuery خیلی زیاد در این رابطه استفاده کردم و به مشکل هم برنخوردم. به شما هم توصیه میکنم. حجمش 100 کیلو هم نیست.

می دونم. بخاطر حجم و ... هم نیست که نمیخوام از جی کوئری استفاده کنم.
میخوام ببینم آیا راهی وجود داره یا نه. یه جایی اینو لازم دارم.

jalil_gh
سه شنبه 28 خرداد 1392, 22:46 عصر
نمیشه async رو false بزاریم و کاری کنیم که کدهای دیگه هم اجرا بشه؟
وقتی که شما async رو برابر با false قرار میدید اجرای کدهای جاوااسکریپت تا رسیدن نتیجه ajax متوقف میشه. نوع طراحی ajax اینجوریه و این یه ایراد نیست.
شما میتونید نوع نگاهتون رو به مسئله عوض کنید. کدهایی رو که قراره بعد از رسیدن نتیجه اجرا بشن رو بعد از رسیدن نتیجه اجرا کنید.

abpsoft
سه شنبه 28 خرداد 1392, 22:52 عصر
کدهایی رو که قراره بعد از رسیدن نتیجه اجرا بشن رو بعد از رسیدن نتیجه اجرا کنید.

ببینید، من یه تابع نوشتم که تصویر لودینگ رو برام توی یه ID نشون بده. به این صورت:
loading('show_here'); //show_here is a Element id.
دقیقاً بعد از این تابع هم اون کد Ajax خودمو نوشتم.
ولی وقتی که اجرا می کنم، چون مرورگر هنگ می کنه (شبیه هنگ کردن)، یعنی منتظر می مونه تا نتیجه بیاد، همون لودینگ رو هم نشون نمیده. و بعد از اینکه جواب از سمت سرور اومد، اون موقع سریع نشون میده و رد میشه.

اگه async رو True بزارم، این عمل درست انجام میشه.
ولی اگه False باشه، با اینکه لودینگ قبل از کد آژاکس هست، نشون داده نمیشه.

jalil_gh
سه شنبه 28 خرداد 1392, 23:08 عصر
نمیدونم شما چطوری این تصوری loading رو به صفحه اضافه میکنید. ولی باید بدونید وقتی یه تصویری چه به صورت background و چه با تگ img به صفحه اضافه میکنید، این تصویر همون لحظه به صفحه اضافه نمیشه و تا لود شدنش بقیه کدهای جاوااسکریپت اجرا میشه. یعنی قبل از اینکه تصویر لود بشه کدهای مربوط به ajax شما اجرا میشه.

abpsoft
سه شنبه 28 خرداد 1392, 23:12 عصر
نمیدونم شما چطوری این تصوری loading رو به صفحه اضافه میکنید. ولی باید بدونید وقتی یه تصویری چه به صورت background و چه با تگ img به صفحه اضافه میکنید، این تصویر همون لحظه به صفحه اضافه نمیشه و تا لود شدنش بقیه کدهای جاوااسکریپت اجرا میشه. یعنی قبل از اینکه تصویر لود بشه کدهای مربوط به ajax شما اجرا میشه.

درست میگید. من با تگ img اضافه می کنم.
حالا فرض می کنیم که تصویر از قبل لود شده. آیا باز هم زمان میبره؟ نظر خودم اینه که بازم باید کمی طول بکشه. چون مرورگر باید ببینه آیا تصویره از سرور تغییر نکرده یا نه. (مثلاً تاریخش)

پس من به جای اضافه کردن کد، از display استفاده می کنم.
اگه درست شد همینجا نتیجشو می زارم.
ممنون از راهنماییتون

cups_of_java
چهارشنبه 29 خرداد 1392, 16:16 عصر
یادتون هم باشه که کلن فلسفه AJAX روی آسنکرون بودن اون هست و مخصوصن داخل محیط مرورگر شما نباید async رو false‌ کنی