آفلاین
user-avatar

انجام کار موازی در javascript بدون تداخل در یکدیگر

3 سال پیش
توسط آرمان منصوری آپدیت شد
آفلاین
user-avatar
آرمان منصوری ( 7549 تجربه )
3 سال پیش
تخصص : برنامه نویس تحت وب و آپ موبایل

من در پنل مدیریتی یه کار سنگین مربوط به ردیاب یه ساعت با جاوااسکریپت ساختم که بر اساس ساعت سرور و اختلاف زمانی مکان فرد (که خود تعیین میکند مثلا تهران 3:30) کار میکند و اطلاعات اولیه هنگام لود ثبت میشه و یک ثانیه یک ثانیه اضافه میشه
حال وقتی یک فایل سنگین Json با Ajax لود میشه 1-2 ثانیه طول میکشه تا لودش کامل بشه و این روند هر 10 تا 30 ثانیه یه بار رخ میده
حال در طی این زمان 1 تا 2 ثانیه ای ساعت کار نمیکند (هیچکدام از بخشهای جاوا اسکریپتی کار نمیکنند) و این مشکل وقتی فرد چند ساعتی روی پنل مشغول مدیریت و ردیابی هستش حاد میشه و ساعت اختلاف زیادی پیدا میکند (هر چند با آپدیت هر 10 دقیقه یبار از طریق سرور مشکل رو ماسمالی دادم)
اما سوال اصلی اینه : چطور میشه کارهای رو در جاوا اسکریپت از شکل موازی به صورت سری بدون ارتباط با یکدیگر انجام داد؟
من قبلا توی آموزشهای آندروید و جاوا خونده بودم اما یادم نمونده اصتلاحش چی بود
ممنون

آفلاین
user-avatar
امیرحسین دشتی زاده ( 6469 تجربه )
3 سال پیش

مطمئن بشین مقدار async برای ajax حتما true باشه

آفلاین
user-avatar
EW ( 13283 تجربه )
3 سال پیش

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

آفلاین
user-avatar
آرمان منصوری ( 7549 تجربه )
3 سال پیش
تخصص : برنامه نویس تحت وب و آپ موبایل

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

<!DOCTYPE HTML>  
<html>  
<head>  
<meta http-equiv="content-type" content="text/html" />  
<meta name="author" content="Arman ABL" />  
<script src="http://www.fastniaz.com/style/js/jquery.js"></script>  
<title>Untitled 1</title>  
</head>

<body>  
<span id="num">0</span><br />  
<button id="click">Click on this</button>  
<script>  
jQuery(document).ready(function(){  
var Number = 0;  
setInterval(function(){  
Number ++;  
$("#num").text(Number);  
}, 100);

    $( document ).on( "click", "#click", function() {
        for(var i=0; i <= 99999 ; i++){
            console.log("Click")
        }
    });

});  
</script>  
</body>  
</html>
آفلاین
user-avatar
EW ( 13283 تجربه )
3 سال پیش

جاواسکریپت به اصطلاح single-thread هستش یعنی در زمان 1 کار رو انجام میده ولی در زبان هایی مثل java میشه بیشتر از 1 thread داشت البته برای جاوا اسکریپت یه سری مثال های خاص هستش که فقط با setinterval و setTimeout میشه انجامشون داد به عنوان مثال

var Number = 0;  
var Number2 = 0;
setInterval(function(){  
Number ++;  
$("#num").text(Number);  
}, 100);

setInterval(function(){  
Number2 ++;  
$("#num2").text(Number2);  
}, 100);  

اگر مثال بالا رو اجرا کنید میبینید همزمان دارند اجرا میشند جز setineterval و settimeout راه دیگه ای برای انجام چند کار با pure javascript نیستش و فقط 1 کد در یک زمان اجرا میشه

آفلاین
user-avatar
آرمان منصوری ( 7549 تجربه )
3 سال پیش
تخصص : برنامه نویس تحت وب و آپ موبایل

دوستان پاسخشو پیدا کردم
میتونیم از Worker استفاده کنیم
آموزش کاملش در این لینک هستش : https://www.w3schools.com/html/html5_webworkers.asp
خودمم 2 مثال ساختم که برای دوستان واضحتر باشه جریان از چه قراره
البته به هنگام مشاهده اطلاعات حلقه ، در کنسول نمایش داده میشه
مثال :
کد بدون Worker برای کار همزمان : http://www.fastniaz.com/data/files/worker/without_worker.htm
کد با Worker برای کار همزمان : http://www.fastniaz.com/data/files/worker/worker.htm
البته وقتی با مثال Worker کار میکنید عدد آپدیت نمیشه اما در پس زمینه همچنان کار رو ادامه میده و هر وقت حلقه فشار رو کم کرد اونو آپدید میکنه
اما در مثال بدون Worker کلا آپدیت عدد متوقف میشه و تا حلقه به پایان نرسه اون ادامه نمیده

دوستان کدهارو مقایسه کنید و نظر خودتونو بگید

آفلاین
user-avatar
Farshidpg ( 6266 تجربه )
3 سال پیش

شاید بشه عددی که نیاز به اپدیت داره رو به جای ایجکس با استفاده از SSE HTML5 از سمت سرور بخونین و سمت کلایت رو فقط عملیات ها رو انجام بدید به این صورت از سمت سرور دیتاها استریم میشه و به صورت async نمایش داده میشه .

البته عملاباید async همون ایجکس هم جوابگو باشه وتداخلی ایجاد نکنه .

آفلاین
user-avatar
آرمان منصوری ( 7549 تجربه )
3 سال پیش
تخصص : برنامه نویس تحت وب و آپ موبایل

اون عدد که تایم هستش یکبار هنگام لود صفحه لود میشه و نیاز به آپدیت نداره و ثانیه ثانیه خودش در صفحه طرف جلو میره و وقتی اسکریپتی لود میشه اون برای چند ثانیه متوقف میشه و این کار اختلاف درست میکنه
نیازی به آپدیت نداره البته هر چند تا حالا من از آپدیت هر 10 دقیقه یبار استفاده میکردم که خیلی حرفه ای نیست
اما حالا با Worker مشکل رو حل کردم و بخوبی هم جواب داد و ساعت شاید برای چند ثانیه به صورت ظاهری متوقف بشه اما در پس زمینه در حال رفتنه و وقتی بقیه اسکریپتها تموم بشه اون دوباره به کار خودش ادامه میده

برای ارسال پاسخ باید وارد سایت شوید