আমি কীভাবে একটি ডার্ট প্রোগ্রাম "ঘুমাতে" পারি


102

আমি আমার ডার্ট অ্যাপ্লিকেশনটিতে পরীক্ষার জন্য একটি অ্যাসিক্রোনাস ওয়েব পরিষেবা কল অনুকরণ করতে চাই। সাড়া জাগানো এই মক কলগুলির এলোমেলো অনুকরণ করার জন্য ('সম্ভবত ভবিষ্যতের বাইরে') আমি আমার মকগুলিকে 'ভবিষ্যত' ফেরত দেওয়ার আগে একটি নির্দিষ্ট সময়ের জন্য অপেক্ষা (ঘুম) করার জন্য প্রোগ্রাম করতে চাই।

কিভাবে আমি এটি করতে পারব?

উত্তর:


111

আপনি বিলম্বের পরে ভবিষ্যত সম্পূর্ণ করতে ফিউচার.ডিলেড কারখানাটিও ব্যবহার করতে পারেন। এখানে দুটি ফাংশনের একটি উদাহরণ যা দেরী হওয়ার পরে অ্যাসিনক্রোনালি স্ট্রিং দেয়:

import 'dart:async';

Future sleep1() {
  return new Future.delayed(const Duration(seconds: 1), () => "1");
}

Future sleep2() {
  return new Future.delayed(const Duration(seconds: 2), () => "2");
}

8
এর উদ্দেশ্য কী () => "1"?
দক্ষিণ গার্গাস

4
আমার কোনও কাজে লাগবে না, এটি আপনার গণনাগুলি করা কেবল একটি স্থানধারক
অনিল 8753

66

এটি সর্বদা যা চান তা নয় (কখনও কখনও আপনি চান Future.delayed) তবে আপনি যদি সত্যিই আপনার ডার্ট কমান্ড-লাইন অ্যাপ্লিকেশনটিতে ঘুমাতে চান তবে আপনি ডার্ট: আইও এর ব্যবহার করতে পারেন sleep():

import 'dart:io';

main() {
  sleep(const Duration(seconds:1));
}

ভাল! দুর্ভাগ্যক্রমে, এই তথ্যটি অফিসিয়াল সাইটে পাওয়া শক্ত।
তৈমুর ফয়েজরখমানভ

11
আপনি যদি ওয়েব অ্যাপ্লিকেশন তৈরি করে থাকেন তবে 'ডার্ট: আইও' গ্রন্থাগারটি উপলব্ধ নেই
অ্যাডেল 41

4
দস্তাবেজগুলি থেকে: যত্ন সহকারে এটি ব্যবহার করুন, কারণ [ঘুম] কলটিতে অবরুদ্ধ অবস্থায় কোনও বিচ্ছিন্নভাবে কোনও অ্যাসিনক্রোনাস অপারেশন প্রক্রিয়া করা যায় না।
বারটেকার্টানাস

4
সতর্কতা : এটি সমকালীন !!! এতে মূল থ্রেড বন্ধ হয়ে যাবে! (আমি এমন নির্বোধের মতো যা আমি করেছি await sleep()এবং ঘুমের সময় অন্যান্য চাকরিগুলি চালানোর প্রত্যাশা করছি :(
ch271828n

4
এই দুইটি বিটিডব্লিউ কী পার্থক্য (ঘুম বনাম ফিউচার.ডলেড)? উভয় পরিস্থিতিতে পর্দার আড়ালে কি চলছে?
টমাস বারান

63

2019 সংস্করণ:

অ্যাসিঙ্ক কোডে

await Future.delayed(Duration(seconds: 1));

সিঙ্ক কোডে

import 'dart:io';

sleep(Duration(seconds:1));

দ্রষ্টব্য: এটি পুরো প্রক্রিয়াটিকে (বিচ্ছিন্ন) অবরুদ্ধ করে, তাই অন্যান্য অ্যাসিঙ্ক ফাংশনগুলি প্রক্রিয়া করা হবে না। এটি ওয়েবে উপলভ্য নয় কারণ জাভাস্ক্রিপ্টটি কেবলমাত্র অসম্পূর্ণ-কেবল।


এই দুইটি বিটিডব্লিউ কী পার্থক্য (ঘুম বনাম ফিউচার.ডলেড)? উভয় পরিস্থিতিতে পর্দার আড়ালে কি চলছে?
টমাস বারান

4
sleep()সম্পূর্ণ বিচ্ছিন্নভাবে সম্পূর্ণরূপে অবরুদ্ধ করে। ঘুমানোর সময় কোনও ডার্ট কোড চলবে না। এটি সম্ভবত সি ++ এর মতো কিছু সংকলন করে std::this_thread::sleep_forFuture.delayed()পরে পুনরায় শুরু করতে অ্যাসিঙ্ক ফাংশনটি শিডিয়ুল করে তবে তারপরে এটি ডার্ট ইভেন্ট লুপটিতে নিয়ন্ত্রণ ফিরিয়ে দেয় যাতে অন্যান্য অ্যাসিঙ্ক ফাংশনগুলি চালিয়ে যেতে পারে।
টিমম্মে

24

আমি দেখেছি কোড বিলম্বের কার্যকরকরণের জন্য ডার্টে বেশ কয়েকটি বাস্তবায়ন রয়েছে:

new Future.delayed(const Duration(seconds: 1)); //recommend

new Timer(const Duration(seconds: 1), ()=>print("1 second later."));

sleep(const Duration(seconds: 1)); //import 'dart:io';

new Stream.periodic(const Duration(seconds: 1), (_) => print("1 second later.")).first.then((_)=>print("Also 1 second later."));
//new Stream.periodic(const Duration(seconds: 1)).first.then((_)=>print("Also 1 second later."));

16

অ্যাসিঙ্ক ফাংশন প্রসঙ্গে ডার্ট 2+ সিনট্যাক্সের জন্য:

import 'package:meta/meta.dart'; //for @required annotation

void main() async {
  void justWait({@required int numberOfSeconds}) async {
    await Future.delayed(Duration(seconds: numberOfSeconds));
  }

  await justWait(numberOfSeconds: 5);
} 

3

এটি একটি কার্যকর উপহাস যা একটি ত্রুটি বিদ্রূপ করতে alচ্ছিক পরামিতি নিতে পারে:

  Future _mockService([dynamic error]) {
    return new Future.delayed(const Duration(seconds: 2), () {
      if (error != null) {
        throw error;
      }
    });
  }

আপনি এটি এর মতো ব্যবহার করতে পারেন:

  await _mockService(new Exception('network error'));

-2

ইউনিট পরীক্ষার সময় আমার কোনও পরিষেবা শেষ হওয়ার জন্য অপেক্ষা করতে হবে। আমি এইভাবে প্রয়োগ করেছি:

void main()
{
    test('Send packages using isolate', () async {
        await SendingService().execute();
    });
    // Loop to the amount of time the service will take to complete
    for( int seconds = 0; seconds < 10; seconds++ ) {
        test('Waiting 1 second...', () {
            sleep(const Duration(seconds:1));
        } );
    }
}
...
class SendingService {
    Isolate _isolate;
    Future execute() async {
        ...
        final MyMessage msg = new MyMessage(...);
        ...
        Isolate.spawn(_send, msg)
            .then<Null>((Isolate isolate) => _isolate = isolate);
    }
    static void _send(MyMessage msg) {
        final IMyApi api = new IMyApi();
        api.send(msg.data)
            .then((ignored) {
                ...
            })
            .catchError((e) {
                ...
            } );
    }
}

এটি ভাল নয় কারণ আপনি সাধারণত জানেন না যে আপনার পরিষেবা শেষ হতে কত সময় লাগে।
এমসিফ্লাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.