Bir Dart programını nasıl "uyuyabilirim"


103

Test için Dart uygulamamda eşzamansız bir web hizmeti çağrısını simüle etmeyi seviyorum. Yanıt veren bu sahte çağrıların rastlantısallığını simüle etmek için (muhtemelen sıra dışı), taklitlerimi 'Gelecek'e geri dönmeden önce belirli bir süre beklemeye (uyumaya) programlamak istiyorum.

Bunu nasıl yapabilirim?

Yanıtlar:


113

Bir gecikmeden sonra bir geleceği tamamlamak için Future.delayed fabrikasını da kullanabilirsiniz. Bir gecikmeden sonra eşzamansız olarak bir dize döndüren iki işleve ilişkin bir örnek:

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
Amacı nedir () => "1"?
Daksh Gargas

2
Sanırım faydası yok, sadece hesaplamalarınızı yapmak için bir yer tutucudur
Anil8753

Uygulamanızı bu işlevlerle uyutmak için await'i kullanmanız gerekir:await sleep1();
Slot

67

Her zaman istediğiniz şey değildir (bazen istediğinizi Future.delayed), ancak Dart komut satırı uygulamanızda gerçekten uyumak istiyorsanız, dart: io's sleep():

import 'dart:io';

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

İyi! Ne yazık ki, bu bilgiyi resmi sitede bulmak zor.
Timur Fayzrakhmanov

11
Bir web uygulaması oluşturuyorsanız 'dart: io' kitaplığı kullanılamaz
adeel41

4
Dokümanlardan: [uyku] çağrısında engellendiğinde eşzamansız işlemler izolatta işlenemeyeceğinden bunu dikkatli kullanın .
bartektartanus

1
UYARI : Bu eşzamanlıdır !!! Ana iş parçacığını durduracak! (Yaptığım await sleep()ve diğer işlerin uyku sırasında çalışmasını beklediğim için çok
aptalım

1
İkisi arasındaki fark nedir (uyku vs Future.delayed)? Her iki senaryoda da perde arkasında neler oluyor?
Tomas Baran

66

2019 baskısı:

Eşzamansız Kodda

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

Eşitleme Kodunda

import 'dart:io';

sleep(Duration(seconds:1));

Not: Bu, tüm süreci bloke eder (izole edin), bu nedenle diğer eşzamansız işlevler işlenmez. Ayrıca, Javascript yalnızca eşzamansız olduğu için web'de de mevcut değildir.


İkisi arasındaki fark nedir (uyku vs Future.delayed)? Her iki senaryoda da perde arkasında neler oluyor?
Tomas Baran

3
sleep()izolatı tamamen bloke eder. Uyurken hiçbir Dart kodu çalışmayacaktır. Muhtemelen C ++ 'lar gibi bir şeye derlenir std::this_thread::sleep_for. Future.delayed()zaman uyumsuz işlevi daha sonra devam edecek şekilde zamanlar, ancak daha sonra denetimi Dart olay döngüsüne döndürür, böylece diğer eşzamansız işlevler çalışmaya devam edebilir.
Timmmm

24

Dart'ta kod gecikmesini yürütmek için birkaç uygulama olduğunu buldum:

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

Dart 2+ sözdizimi için, eşzamansız işlev bağlamında:

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

Bu, bir hatayı taklit etmek için isteğe bağlı bir parametre alabilen kullanışlı bir modeldir:

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

Bunu şu şekilde kullanabilirsiniz:

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

-2

Ayrıca bir birim testi sırasında bir hizmetin tamamlanmasını beklemem gerekiyordu. Bu şekilde uyguladım:

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

Normalde hizmetinizin bitmesi için ne kadar zaman gerektiğini bilmediğiniz için bu iyi değildir.
mcfly
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.