آموزش دونه:مرجع آموزش

برنامه نویسی غیر همزمان در دارت (Dart Asynchronous) آموزش زبان برنامه نویسی دارت Dart

 

دارت

برنامه نویسی غیر همزمان در دارت Dart Asynchronous

برنامه نویسی غیر همزمان مفهومی است که در آن دستورات یا کد های asynchronous به صورت مستقل از سایر دستورات اجرا می‌شود.
در حالت عادی دستورات پشت سر هم اجرا می‌شوند و تا زمانی که اجرای یک دستور به پایان نرسیده است، دستورات بعدی اجرا نمی‌شوند.
اما هنگامی که یک دستور asynchronous اجرا می‌شود، سایر دستورات برنامه به اجرای خود بدون توجه به این نوع دستورات ادامه می‌دهند.

برنامه نویسی همزمان Synchronous

مثال زیر را در نظر بگیرید: Dart Asynchronous

 

()readLineSync یک تابع synchronus (همزمان) است. (مانند تابع print)
یعنی تمام دستوراتی که به دنبال این تابع آمده اند، تا زمانی که اجرای این تابع به پایان نرسد، اجرا نخواهد شد.
این تابع منتظر ورودی کاربر می‌ماند و زمانی که کاربر آن را وارد کرد، این تابع مقدار آن ورودی را برمی‌گرداند.

خروجی مثال بالا به شکل زیر است:

برنامه نویسی غیر همزمان Asynchronous

مشکل برنامه نویسی همزمان یا synchronous در این است که اگر اجرای یک تابع مدت زیادی طول بکشد، سایر کد های برنامه منتظر اجرا می‌مانند.
برای رفع این مشکل از تکنیک برنامه نویسی غیر همزمان یا Asynchronous استفاده می‌کنیم.
در این روش می‌توانیم یک تابع را را به صورت async تعریف و اجرا کرده و همزمان، سایر کد های برنامه که به دنبال آن تابع آمده اند نیز می‌توانند اجرا شوند. (نمیدونم چرا اسم این روش رو گذاشتن غیر همزمان!)

به نظر می‌رسد در برنامه نویسی غیر همرمان نیز یک مشکل وجود دارد.
فرض کنید برنامه ای نوشته اید یک یک عکس را از اینترنت دریافت کرده و آن را نمایش می‌دهد.
از آن جایی که تابع دریافت تصویر از اینترنت را به صورت async پیاده سازی کرده ایم، سایر کد های برنامه نیز همزمان با اجرای این تابع، اجرا خواهد شد.
یعنی تابع مربوط به نمایش تصویر نیز اجرا خواهد شد اما به درستی کار نخواهد کرد زیرا تصویر هنوز به صورت کامل دریافت نشده است.
در اینجا احساس می‌شود که تابع نمایش تصویر باید پس از اجرای کامل تابع دریافت تصویر (async) اجرا شود.

برای این مشکل راه حل ساده ای وجود دارد.
باید کاری کنیم که تابع async مثل synchronous عمل کند.
برای این کار دو روش وجود دارد:

  • استفاده از asyncو await
  • استفاده از تابع then

استفاده از async و await

کد هایی که از async و await استفاده می‌کنند، به صورت غیر همزمان اجرا می‌شوند.

await حتما باید در یک تابع async اجرا شود.
استفاده از await با یک تابع باعث می‌شود تا سایر کد ها تا زمانی که اجرای آن تابع تمام نشده است، اجرا نشوند.

در مثال زیر، تا زمانی که اجرای تابع ()lookUpVersion به صورت کامل تمام نشده است، سایر کدهای تابع ()checkVersion (در اینجا تابع print) اجرا نخواهد شد.

Future یک کلاس در کتابخانه dart:async است. از این کلاس برای دریافت مقدار برگشتی یک تابع async استفاده می‌کنیم.(در مثال بالا هیچ مقداری برگشت داده نمی‌شود)
همچنین وجود کلاس Future برای استفاده از تابع ()then ضروری است که در ادامه به توضیح آن می‌پردازیم.

از await می‌توانیم چندین بار در یک تابع async استفاده کنیم:

حال مثال کلی زیر  را درنظر بگیرید: Dart Asynchronous

خروجی آن به شکل زیر است:

استفاده از متد ()then

متد then از طریق یک تابع که یک مقدار Future را برمی‌گرداند، فراخوانی می‌شود.
این متد یک تابع را به عنوان پارامتر گرفته و آن تابع را پس از اجرای کامل تابعی که آن را فراخوانی کرده است، اجرا می‌کند.

تعدادی از توابع زبان دارت یک مقدار Future برمی‌گردانند. پس می‌توان از متد then بر روی این توابع استفاده کرد.
مانند تابع ()HttpRequest.getString .

نکته: تابعی که یک مقدار Future برمی‌گرداند، به صورت Async یا غیر همزمان اجرا می‌شود.

مثال:

فرض کنید فایلی به نام context.txt با محتویات زیر داریم:

برنامه زیر محتویات این فایل را خوانده و آن ها را نمایش می‌دهد.

خروجی:

Dart Asynchronous

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

دانلود نرم افزار اندرویدی آموزش  زبان برنامه نویسی دارت از کافه بازار

مطالب مرتبط