ترتیب اجرای دستورات در js

سلام
با یه مشکل خیلی عجیب رو به رو شدم
توی react تو یه تابع یه چیزی رو به state اضافه کردم با setState و تو خط بعدی ازش اومدم استفاده کنم ولی مقدار جدید هنوز ست نشده بود و من متوجه شدم از جاوا اسکریپت نباید توقع داشته باشی خط به خط دستورات رو اجرا کنه
تو نت سرچ کردم و الآن اگه توی یه تابع قرار باشه دو تا تابع فراخوانی کنم مجبورم دوتا تابع دیگه بنویسم توی تابع اول یه پارامتر callback به عنوان ورودی تابع بگیرم و کاری که میخوامو انجام بدم بعد callback رو صدا بزنم و توی تابع اصلیم هم همین تابع رو فراخوانی کنم و تابع دوم رو به عنوان پارامتر callback بدم بهش که به ترتیب توابع اجرا بشه
یعنی در واقع کاری که تو هر زبانی توی یه تابع انجام میشه اینجا باید براش سه تا تابع بنویسی! :neutral_face: :neutral_face:
ولی آخه چرا؟ نمیشه مثل بچه آدم خط به خط اجرا کنه؟

سلام
خوب ری اکت داره asynchronous کارا رو پیش میبره. اگه شما با رفتارهای توابع ری اکت آشنا باشی به همچین مشکلی بر نمیخوری.
شما باید در این حالت از اون متغیر جدیدی که توی setState ذخیره کردی استفاده کنی نه اینکه اونه از state بخونی.

اگر بتونی کدتون رو بذاری بهتر میشه راهنمایی کرد

1 Likes

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

1 Likes

سلام
فرض کنید من یک تابع دارم توقع دارم دستوراتش خط به خط اجرا بشه
برای مثال

function something() {
    doFirst();
    doSecond();
}

something();

الآن من یه تابع نوشتم و فراخوانی کردمش توقع دارم به همون ترتیبی که نوشتم اجرا بشه یعنی اول doFirst بعد doSecond ولی نمیشه!!!
مجبورم همیچین کاری بکنم:

function something() {
  handleDoFirst(function() {doSecond();});
}

function handleDoFirst(callback) {
  doFirst();
  callback();
}

الان من یک مثال ساده تو همین کنسول کروم نوشتم خط به خط اجرا شد.
شاید بدنه توابع شما دارای promise هستند و به خاطر همین asynchronous داره اجرا میشه.
میتونید بدنه توابع مورد نظر رو بگید چون در این حالت نمیشه قضاوت درستی انجام داد.

1 Likes

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

1 Likes

سلام
آخه مشکلی که باهاش مواجه شدم رو حل کردم و الآن به اون کد دسترسی ندارم که بفرستم
فکر میکنم داخل یه تابع یه setState بود بعدش یه ریکوئست با axios که به ترتیب اجرا نمیشد

هر دو مورد به صورت async رفتار میکنند

یعنی چی دقیقا؟ میشه بیشتر توضیح بدین

همونطور که میدونید Axios وقتی درخواستی رو میفرسته سمت سرور چند ثانیه طول میکشه تا جواب برسه. اگر قرار بود که کد خط به خط اجرا بشه باید کد اونجا توقف میکرد تا جواب برسه بعد بره سطرهای بعدی. ولی در حالت async این اتفاق نمیوفته و اون درخواست در بک گراند جاوا اسکریپت ران میشه و کد روال خودش طی میکنه تا جواب از سمت سرور برسه. همون اتفاقی که در setTimeout و setInterval اتفاق میوفته.

2 Likes