PDA

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



bftarane
پنج شنبه 13 مهر 1396, 18:17 عصر
سلام
لطفا این کد زیر رو ببینید، من انتظار داشتم با کدهای زیر ابتدا فانکشن one اجرا بشه ولی ابتدا two اجرا میشه، مشکل کجاست؟


<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script>
function one(callback)
{

setTimeout(function () { alert("this is function one") }, 1000);


callback();
}
function two()
{
alert("this is function two");
}

</script>
</head>
<body>
<button onclick="one(two)">Click Here</button>
</body>
</html>

plague
پنج شنبه 13 مهر 1396, 21:55 عصر
دلیلش خاصیت async یا Non-blocking جاوا اسکریپته بر خلاف زبان های دیگه که اصطلاحا sync اجرا میشن
در اکثر زبان ها کد ها به صورت خط به خط اجرا میشن و تا وقتی یک خط اجرا نشده خط بعدیش اجرا نخواهد شد (میتونی به شکل یک خط راست از بالا به پایین تصوری کنی اجرای کد رو که وقتی به انتهای خط رسید خروجی میده و بعد میمیره )
توی جاوا اسکریپت اجرا کننده منتظر یک خط کد نمیمونه بلکه به خط بعدی میره و اون رو اجرا میکنه وقتی به انتها رسید بر خلاف زبان های دیگه نمیمیره و دوباره برمیگرده از اول و اون خطوطی رو که در اجرای قبلی ازشون گزشته رو چک میکنه اگه زمان اجراشو نرسیده باشه اجرا میکنه وگرنه بازم میگزره و اینکار رو باز تکرار میکنه میتونی اجرا رو به شکل یک حرکت دایره وار تصور کنی به دور کد ها
البته این خیلی ساده و جوری بود که متوجه بشی مطالب زیاد هست راجبش که میتونی بخونی

bftarane
پنج شنبه 13 مهر 1396, 22:54 عصر
ممنون، توضیحات خوبی بود
منم به همون دلیلی که شما گفتید، برای اینکه تا یک فانکشن تموم نشده فانکشن بعدی شروع به اجرا نشه از callback استفاده کردم.

حالا این مشکل با تغییر کد ذیل

function one(callback) { setTimeout(function () { alert("this is function one") }, 1000);
callback();
}
به

function one(callback) { setTimeout(function () { alert("this is function one");callback();}, 1000);


}
حل شد. یعنی callback(); رو داخل settimeout قرار دادم.
ولی خوب هنوز دلیل این که چرا callback(); در حالت قبلی جواب نمی داد برام گنگه، که با این حساب فکر کنم من برداشت درستی از نحوه عملکرد تابع settimeout ندارم.

plague
پنج شنبه 13 مهر 1396, 23:47 عصر
چرا انتظار داشتی اول one اجرا بشه وقتی 1 ثانیه تاخیر انداختی روش ؟
setTimeout میگه 1 ثانیه دیگه این کد رو اجرا کن نه همین الان
به همون دلیلی که بالا گفتم پردازشگر 1 ثانیه نمیمونه متظر میپره میره تابع دوم رو اجرا میکنه و بعد 1 ثانیه برمیگرده تابع اول رو اجرا میکنه
تو کد دومت چون روی هر دو تابع 1 ثانیه تاخیر انداختی به ترتیب اجرا میشن