PDA

View Full Version : سوال: ایجاد تاخیر در جاوا اسکریپت



parsdarab
یک شنبه 13 تیر 1395, 22:08 عصر
سلام

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

من با زبان های دیگه کار نکردم فقط تو سی شارپ برای ایجاد تاخیر از دستور sleep استفاده میکنن که این توی سرور انجا میشه
من میخام یک sleep سمت کلاینت کاربر انجام بدم
توی جاوا اسکریپت هم چین تابعی داریم آیا؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

ravand
دوشنبه 14 تیر 1395, 09:54 صبح
با یه جستجوی ساده میتونستی پیدا کنی:

<html>
<head>
<script type="text/javascript">
function timedMsg()
{
var t=setTimeout("alert('I am displayed after 3 seconds!')",3000)
}
</script>
</head>
<body>
<form>
<input type="button" value="Display timed alertbox!" onclick="timedMsg()" />
</form>
</body>
</html>

parsdarab
دوشنبه 14 تیر 1395, 23:13 عصر
سلام

این کد داخل حلقه for نوشتم اما تاخیر نیافتاد


for (var i = 0; i < message.length; i++) {
if (message[i].IsValid == true) {
ShowMessage('success', message[i].Massage, "موفقیت")
} else {
var t = setTimeout("ShowMessage('warning', message[i].Massage, 'خطا');", 3000)
}
}

kb0y667
شنبه 19 تیر 1395, 04:18 صبح
یادتون باشه همیشه اگر کدی نوشتید و کارنکرد ، ایراد از اون زبان برنامه نویسی هست نه شما

در این مثال ، ایراد از جاوا اسکریپت هست


دوست عزیز به این روش عمل کنید :

for (var i = 0; i < message.length; i++) {
if (message[i].IsValid == true) {
var t = setTimeout("ShowMessage('success', message[i].Massage, 'OK')", i*3000);
} else {
var t = setTimeout("ShowMessage('warning', message[i].Massage, 'Error')", i*3000);
}
}





همون کد __ کمی عاقلانه تر :

for (var i = 0; i < message.length; i++) {
if (message[i].IsValid == true) {
var t = "ShowMessage('success', message[i].Massage, 'OK')";
} else {
var t = "ShowMessage('warning', message[i].Massage, 'Error')";
}setTimeout(t, i*3000);
}





همون کد __ کمی حرفه ای تر :

for(i=0;i<message.length;i++)
if (message[i].IsValid)
t = "ShowMessage('success', message[i].Massage, 'OK')";
else
var t = "ShowMessage('warning', message[i].Massage, 'Error')";
setTimeout(t, i*3000);





دیگه خیلی حرفه ای بخوای :


for(i=0;i<message.length;++i) setTimeout("ShowMessage("+message[i].IsValid?"'success',message["+i+"].Massage,'OK'":"'warning',message["+i+"].Massage,'Error'"+")",i*3e3)





:|

parsdarab
شنبه 19 تیر 1395, 10:26 صبح
سلام
ممنونم از وقتی که گذاشتین
تمام کد ها رو چک کردم به صورت زیر

function ShowMultiMessage(message) {

for (i = 0; i < message.length; i++)
if (message[i].IsValid)
t = "ShowMessage('success', message[i].Massage, 'OK')";
else
var t = "ShowMessage('warning', message[i].Massage, 'Error')";
setTimeout(t, i * 3000);

//for (var i = 0; i < message.length; i++) {
// if (message[i].IsValid == true) {
// var t = setTimeout("ShowMessage('success', message[i].Massage, 'OK')", i * 3000);
// } else {
// var t = setTimeout("ShowMessage('warning', message[i].Massage, 'Error')", i * 3000);
// }
//}

//for (i = 0; i < message.length; i++)
// if (message[i].IsValid)
// t = "ShowMessage('success', message[i].Massage, 'OK')";
// else
// var t = "ShowMessage('warning', message[i].Massage, 'Error')";
//setTimeout(t, i * 3000);

//for (var i = 0; i < message.length; i++) {
// if (message[i].IsValid == true) {
// ShowMessage('success', message[i].Massage, "موفقیت")
// } else {
// var t = ShowMessage('warning', message[i].Massage, 'خطا')
// } setTimeout(t, i * 3000);
//}
}

اما جواب نگرفتم:متفکر:

SCoder
شنبه 19 تیر 1395, 17:14 عصر
این تابع :




function sleep(sleepTime , func){
(function(){
var now = new Date().getTime();
while(new Date().getTime() < now + sleepTime);
})();
func ? func() : '';
}}





و طریقه استفاده :





sleep(5000,function(){console.log('after 5 seconds this will be print on console');});



بعد از 5 ثانیه تابعی رو که بعنوان پارامتر دوم دادی رو اجرا میکنه ...

اگه میخواهی فقط برای مدت مشخص بدون هیچ کاری sleep کنی :





sleep(3000);//waits 3 seconds


console.log('after 3 seconds this will be print');


و کد خودت :






for (var i = 0; i < message.length; i++) {
if (message[i].IsValid == true) {
ShowMessage('success', message[i].Massage, "موفقیت")
} else {
sleep(3000);//waits here for 3 seconds
var t = ShowMessage('warning', message[i].Massage,"خطا");
}
}

parsdarab
دوشنبه 21 تیر 1395, 00:31 صبح
سلام

مرسی جواب داد.

تاخیر ایجاد میشه

اما یه مشکل کوچیک هست اونم اینکه ممکنه داخل حلقه for پنچ تا پیام باشه و ما sleep رو روی 500 میلی ثانیه تنظیم کرده باشیم. حالا چه اتفاقی میفته؟
5*500 میلی ثانیه صبر میکنه یعنی 2.5 ثانیه بعد تمام پیام ها رو باهم نمایش میده.
هدف من تاخیر بین پیام ها بود و نمایش پیام بعدی بعد از 500 میلی ثانیه

کد فوق تاخیر ایجاد میکنه اما اما بعد از 2.5 ثانیه تمام پیام ها رو نشون میده
حالا از کجا بفهمیم تاخیر اتفاق افتاده یا نه؟
بعد از نمایش پیام ها اون پیامی که اول از همه نمایش داده شده زودتر از بین میره الان این اتفاق میفته و کاملا درسته

الان مشکل از نمایش پیام ها یکی پس از دیگری می باشد.

ممنونم از بچه های این تالار

SCoder
دوشنبه 21 تیر 1395, 16:22 عصر
(اگه سوالت رو درست متوجه شده باشم) sleep رو در ابتدای for قرار بده تا بین هر پیامت توقف اندکی باشه ....







for (var i = 0; i < message.length; i++) {
sleep(3000);//waits here for 3 seconds
if (message[i].IsValid == true) {
ShowMessage('success', message[i].Massage, "موفقیت")
} else {

var t = ShowMessage('warning', message[i].Massage,"خطا");
}
}




برای مثال این تابع برای نمایش even و Odd هر بار 3 ثانیه صبر میکنه ....





for (var i = 0; i < 5; i++) {
sleep(3000);//waits here for 3 seconds
if (i % 2 === 0) {
console.log('even');
} else {
console.log('Odd');
}
}



اگر هم میخوای متوجه این بشی که تاخیر کلا اتفاق افتاده یا نه پارامتر دوم این تابع sleep رو یه تابع بده به صورت زیر و بعدش پیام رو تو کنسول چک کن و یا alert کن ....





sleep(3000,function(){
alert('sleep called');
});
//or


sleep(3000,function(){
console.log('sleep callled');
});




موفق باشید ...

parsdarab
سه شنبه 22 تیر 1395, 11:11 صبح
سلام
اره همین کار رو کردم اما تمام پیام ها همزمان نمایش داده میشه.



for (var i = 0; i < errors.length; i++) {
sleep(500);
ShowMessage('warning', errors[i], "خطا");
}

من احساس می کنم مشکل از اجرای دستورات جاوا اسکریپت باشه
یعنی کد رو باید به صورت غیر همزمان صدا بزنیم.
ایا توی جاوا اسکریپت هم چین دستوری داریم که بیاد به صورت غیر همزمان کدنویسی کنیم.

اگه کد زیر رو تست کنید.




for (var i = 0; i < errors.length; i++) {
sleep(500);
console.log('sleep callled');
//ShowMessage('warning', errors[i], "خطا");
}

141409


می بینید که به ازای (تعداد خطاها * نیم ثانیه) صبر میکنه بعد یهویی باهم همشو نشون میده؟؟؟!!!

تاخیر میفته اما پیام ها نمایش داده نمیشه همون لحظه مثلا بعد از 4 ثانیه به صورت زیر نمایش داده میشه

141410

kb0y667
جمعه 01 مرداد 1395, 00:52 صبح
خیلی تعجب کردم از اینکه گفتی "کد بنده عمل نکرد"

ولی طبق کد جناب SCoder (http://barnamenevis.org/member.php?363863-SCoder) این روش رو تست کن :


بجای

sleep(500);

به این صورت

sleep(i*500);


منتظر شنیدن نتیجه هستم :|

kb0y667
جمعه 01 مرداد 1395, 01:03 صبح
این کد هم تست کن ، خبرم کن :



for(i=0;i<message.length;i++){
t=message[i].IsValid?
"ShowMessage('success',message[i].Massage,'OK')":"ShowMessage('warning',message[i].Massage,'Error')";
setTimeout(t,i*3000);
}

parsdarab
جمعه 01 مرداد 1395, 10:05 صبح
این کد هم تست کن ، خبرم کن :



for(i=0;i<message.length;i++){
t=message[i].IsValid?
"ShowMessage('success',message[i].Massage,'OK')":"ShowMessage('warning',message[i].Massage,'Error')";
setTimeout(t,i*3000);
}



سلام این کد به صورت زیر تست شد اما تاخیر نیفتاد
نمی دونم دلیلش چیه؟؟


for (var i = 0; i < errors.length; i++) {
t = ShowMessage('warning', errors[i], "خطا");
setTimeout(t, i * 3000);
}

parsdarab
جمعه 01 مرداد 1395, 10:15 صبح
خیلی تعجب کردم از اینکه گفتی "کد بنده عمل نکرد"

ولی طبق کد جناب SCoder (http://barnamenevis.org/member.php?363863-SCoder) این روش رو تست کن :


بجای

sleep(500);

به این صورت

sleep(i*500);


منتظر شنیدن نتیجه هستم :|

این کد که تست می کنم


for (var i = 0; i < errors.length; i++) {
sleep(i * 100);
ShowMessage('warning', errors[i], "خطا");
}
تاخیر میفته اما نتیجه دلخواه رو نمیده
منظورم اینه که (فکر کنم چون میخاد با UI کار کنه یعنی میخاد عملیات یوزر اینترفیسی انجام بشه نمی تونه اونو پردازش کنه ابتدا پردازش رو تموم میکنه بعد عملیات UI انجام میشه)