مدیریت تاخیرها در دارت

تعداد بازدید ها : 1,552 بازدید
 مدیریت تاخیرها در دارت

قبل از اینکه در رابطه با مدیریت تاخیر (Delay) صحبت کنم باید تاخیر را تعریف کنم . تاخیر یعنی پاسخی که بلافاصله برگشت داده نمی شود و به مدتی زمان برای اجرا نیاز دارد . در این گونه مواقع برنامه یا فریز می شود (اصطلاحا یخ می زند و به هیچکدام از فرامین کاربر واکنش نشان نمی دهد) یا به خطا برخورد می کند ، چرا که در خط بعد تلاش می کند تا از نتیجه خروجی دستور قبل استفاده نماید و این مقدار هنوز null است .

تاخیر (Delay) یعنی پاسخی که بلافاصله برگشت داده نمی شود !!

اما تاخیرها در چه مواقعی ایجاد می شوند ؟

برخی فرامین ذاتا زمانبر هستند ، مثلا فرامینی که باید دیتایی را از سمت سرور فراخوانی نمایند یا فرامینی که باید مقداری را در بانک داده محلی ذخیره نمایند و یا فرامینی که قرار است با سخت افزار گوشی ارتباط برقرار کنند ، جزء دسته فرامین زمانبر هستند و اگر در تابعی مورد استفاده قرار گیرند ، تاخیر بروز می کند .

برای مدیریت تاخیرها در محیط برنامه نویسی دارت ، ۲ راه حل پیش بینی شده است :

  1. استفاده از کال بک فاکنشن ها (Callback Function)
  2. استفاده از آینده ها (Future)

 

روش اول Callback Function

در این روش در لحظه تعریف متد یک ورودی از نوع Function برای آن تعریف می کنیم تا در لحظه فراخوانی یک Callback Function به شکل {}() به آن پاس دهیم . در این حالت ، زمانی که از داخل متد ، Function مقدار دهی شود ، Callback Function اجرا شده و دستورات داخل آن اجرا می گردد . قطعه کد زیر نمونه ای از این روش پیاده سازی را نمایش می دهد :

void main() {
  print(
    httpRequest('www.mywebsite.ir',(String value){
        print(value);
      }
    )
  );
}

httpRequest(String url, Function myFunction) {
  Future.delayed(new Duration(seconds: 2), () {
    myFunction('your input is : ' + url);
  });
}

در کد فوق ما یک تابع به اسم httpRequest تعریف کرده ایم که در داخل خود توسط تابع Future.delayed یک تاخیر ۲ ثانیه ای ایجاد می کند ، و در لحظه فراخوانی تابعی به روش Callback Function به این تابع متصل شده و منتظر دریافت خروجی هستیم . هر زمان تابع از داخل خود Function را مقداردهی نماید ، ما در خروجی آن مقدار را دریافت می نماییم .

می خوانم   کلاس InkWell

خروجی کد فوق در تصویر زیر قابل مشاهده است :

CallBack_Functions

معایب روش Callback Function

برای کال بک فانکشن دو عیب اساسی می توان نام برد :

۱- پیچیدگی فزاینده :

در این حالت اگر نیاز باشد به نسبت خروجی تابع اول ، تابع دیگری را فراخوانی کنید که خود آن نیز دارای تاخیر است و مجدد باید از Callback استفاده نماید ، کد شما بسیار پیچیده می شود و درک آن سخت می گردد .

۲- مدیریت خطاهای بسیار سخت :

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

روش دوم استفاده از Future ها

راه حل جایگزین و بهینه ای که دارت برای مدیریت تاخیرها ارائه داده است ، استفاده از Future هاست . جهت استفاده از Future ها به دو روش می توان عمل کرد . در روش اول که نمونه ای از آن را در کد زیر مشاهده می کنید ، در تعریف نام تابع از کلمه کلیدی Future استفاده می کنیم و در لحظه فراخوانی تابع نیز از کلمه کلیدی then استفاده می کنیم . خطاها نیز در catchError برگشت داده می شود . به قطعه کد زیر توجه کنید :

void main() {
  httpRequest('www.mywebsite.ir')
    .then((value){
      print(value);
    })
    .catchError((e){
      print(e);
    });
}

Future<String> httpRequest(String url) {
  return Future.delayed(new Duration(seconds: 2), () {
    return 'your input is : ' + url;
  });
}

خروجی کد فوق در تصویر زیر قابل مشاهده است :

Future

و اما راه حل دوم استفاده از Future ها ، استفاده از کلمات کلید async و await است . به عنوان مثال به کد زیر دقت نمایید :

void main() async {
  try {
    print(await httpRequest('www.mywebsite.ir'));
  } catch (e) {
    print(e);
  }
}

Future<String> httpRequest(String url) {
  return Future.delayed(new Duration(seconds: 2), () {
    return 'your input is : ' + url;
  });
}

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

می خوانم   ویجت ListView

خروجی کد فوق در تصویر زیر قابل مشاهده است :

Future_asyncجهت کسب اطلاعات بیشتر از این آدرس به سایت اصلی دارت مراجعه نمایید .

امیدوارم این مطلب برای شما مفید باشد .

1+
محمدمجتبی جوارشکیان

محمدمجتبی جوارشکیان

من محمدمجتبی جوارشکیان ، کارشناس IT و فعال اجتماعی هستم و در حوزه معماری ، طراحی ، تحلیل گری ، مدلسازی و توسعه ی محیط های نرم افزاری فعالیت دارم . بسیار خوشحال می شوم من را از انتقادات ، پیشنهادات و نظرات خود مطلع فرمایید . آدرس ایمیل : info@javareshkian.ir

ارسال یک پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شانزده + 6 =