221 votes

Comment "mettre en veille" un programme Dart ?

J'aime simuler un appel de service web asynchrone dans mon application Dart pour les tests. Pour simuler le caractère aléatoire de la réponse de ces appels fantaisie (éventuellement dans le désordre), je voudrais programmer mes fantaisies pour qu'elles attendent (sleep) pendant un certain temps avant de renvoyer le 'Future'.

Comment puis-je le faire ?

293voto

Timmmm Points 9909

Edition 2019 :

Dans le code asynchrone

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

Code In Sync

import 'dart:io';

sleep(Duration(seconds:1));

Note : Cela bloque l'ensemble du processus (isoler), de sorte que les autres fonctions asynchrones ne seront pas traitées. Elle n'est pas non plus disponible sur le web car Javascript est vraiment asynchrone.

161voto

Shailen Tuli Points 5123

Vous pouvez également utiliser la fabrique Future.delayed pour compléter un futur après un délai. Voici un exemple de deux fonctions qui renvoient une chaîne de caractères de manière asynchrone après un délai :

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");
}

79voto

Seth Ladd Points 13589

Ce n'est pas toujours ce que vous voulez (parfois vous voulez Future.delayed ), mais si vous voulez vraiment dormir dans votre application en ligne de commande Dart, vous pouvez utiliser l'outil dart:io sleep() :

import 'dart:io';

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

33voto

SpkingR Points 197

J'ai découvert qu'il existe plusieurs implémentations dans Dart pour retarder l'exécution du code :

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."));

22voto

Bono Lv Points 91

Pour la syntaxe Dart 2+, dans un contexte de fonction asynchrone :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X