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

react
javascript
js
reactjs

#1

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


#2

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

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


#3

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


#4

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

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

something();

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

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

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

#5

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


#6

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


#7

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


#8

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


#9

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


#10

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