मैं डार्ट प्रोग्राम को कैसे "सो" सकता हूं


102

मुझे परीक्षण के लिए अपने डार्ट एप्लिकेशन में एक अतुल्यकालिक वेब सेवा कॉल का अनुकरण करना पसंद है। इन नकली कॉलों की यादृच्छिकता का अनुकरण करने के लिए (संभवत: आदेश से) मैं 'भविष्य' लौटने से पहले एक निश्चित अवधि के लिए प्रतीक्षा करने (नींद) के लिए अपने मॉक को प्रोग्राम करना चाहूंगा।

मैं यह कैसे कर सकता हूँ?

जवाबों:


111

आप एक विलंब के बाद भविष्य पूरा करने के लिए Future.delayed कारखाने का उपयोग कर सकते हैं। यहां दो कार्यों का एक उदाहरण दिया गया है जो एक स्ट्रिंग को विलंब के बाद अतुल्यकालिक रूप से वापस करते हैं:

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"?
दक्ष गरगास

2
मुझे लगता है कि कोई फायदा नहीं है, यह सिर्फ एक प्लेसहोल्डर है जो आपके कंपीटिशन करने के लिए है
Anil8753

66

यह हमेशा वह नहीं होता जो आप चाहते हैं (कभी-कभी आप चाहते हैं Future.delayed), लेकिन यदि आप वास्तव में अपने डार्ट कमांड-लाइन ऐप में सोना चाहते हैं, तो आप डार्ट का उपयोग कर सकते हैं: io's sleep():

import 'dart:io';

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

अच्छा! दुर्भाग्य से, यह जानकारी आधिकारिक साइट पर पाना मुश्किल है।
तैमूर फैज़्रखमानोव

11
यदि आप एक वेब एप्लिकेशन बना रहे हैं तो 'डार्ट: io' लाइब्रेरी उपलब्ध नहीं है
adeel41

4
डॉक्स से: देखभाल के साथ इसका उपयोग करें, क्योंकि कोई एसिंक्रोनस ऑपरेशन एक आइसोलेट में संसाधित नहीं किया जा सकता है जबकि इसे [स्लीप] कॉल में ब्लॉक किया गया है।
bartektartanus

1
चेतावनी : यह तुल्यकालिक है !!! यह मुख्य धागे को रोक देगा! (मैं ऐसा मूर्ख हूं जो मैंने किया await sleep()और सोने के दौरान चलने वाले अन्य कामों की उम्मीद करता है :(
ch271828n

1
क्या अंतर है कि उनमें से दो (नींद बनाम Future.delayed) btw? दोनों परिदृश्यों में पर्दे के पीछे क्या चल रहा है?
टॉमस बारन

62

2019 संस्करण:

Async कोड में

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

सिंक कोड में

import 'dart:io';

sleep(Duration(seconds:1));

ध्यान दें: यह पूरी प्रक्रिया को अलग करता है (अलग), इसलिए अन्य async कार्यों को संसाधित नहीं किया जाएगा। यह वेब पर भी उपलब्ध नहीं है क्योंकि जावास्क्रिप्ट वास्तव में केवल async है।


क्या अंतर है कि उनमें से दो (नींद बनाम Future.delayed) btw? दोनों परिदृश्यों में पर्दे के पीछे क्या चल रहा है?
टॉमस बारन

3
sleep()पूरी तरह से अलग-थलग कर देता है। सोते समय कोई डार्ट कोड नहीं चलेगा। यह शायद C ++ की तरह कुछ को संकलित करता है std::this_thread::sleep_forFuture.delayed()बाद में फिर से शुरू करने के लिए async फ़ंक्शन को शेड्यूल करता है, लेकिन फिर यह डार्ट ईवेंट लूप पर नियंत्रण लौटाता है ताकि अन्य async फ़ंक्शन चलते रहें।
टिम्मम

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+ सिंटैक्स के लिए, एक async फ़ंक्शन संदर्भ में:

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

यह एक उपयोगी मॉक है जो एक त्रुटि को मॉक करने के लिए एक वैकल्पिक पैरामीटर ले सकता है:

  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) {
                ...
            } );
    }
}

यह अच्छा नहीं है क्योंकि आप आमतौर पर यह नहीं जानते हैं कि आपकी सेवा समाप्त होने में कितना समय लगता है।
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.