Как я могу "уснуть" программу Dart

102

Мне нравится моделировать вызов асинхронного веб-сервиса в моем приложении Dart для тестирования. Чтобы смоделировать случайность ответов этих ложных вызовов (возможно, не по порядку), я хотел бы запрограммировать мои макеты на ожидание (сон) в течение определенного периода времени, прежде чем возвращать «Будущее».

Как я могу это сделать?

Винни
источник

Ответы:

111

Вы также можете использовать фабрику Future.delayed для завершения future после задержки. Вот пример двух функций, которые возвращают строку асинхронно после задержки:

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"?
Daksh Gargas
2
Думаю, бесполезно, это просто заполнитель для ваших вычислений
Anil8753
Чтобы засыпать ваше приложение с этими функциями, вам нужно использовать await:await sleep1();
Слот
67

Это не всегда то, что вы хотите (иногда вы хотите Future.delayed), но если вы действительно хотите спать в своем приложении командной строки Dart, вы можете использовать dart: io's sleep():

import 'dart:io';

main() {
  sleep(const Duration(seconds:1));
}
Сет Лэдд
источник
Хороший! К сожалению, эту информацию сложно найти на официальном сайте.
Тимур Файзрахманов
11
Библиотека 'dart: io' недоступна, если вы создаете веб-приложение
adeel41,
4
Из документации: используйте это с осторожностью, поскольку в изолированном объекте невозможно обрабатывать асинхронные операции, пока он заблокирован в вызове [sleep].
bartektartanus 02
1
ВНИМАНИЕ : это синхронно !!! Это остановит основной поток! (Я такой дурак, что await sleep()и делал, и ожидаю, что другие задания будут выполняться во время сна :(
ch271828n
1
В чем разница между ними (sleep vs Future.delayed)? Что происходит за кулисами в обоих сценариях?
Томас Баран,
63

Издание 2019 г .:

В асинхронном коде

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

В коде синхронизации

import 'dart:io';

sleep(Duration(seconds:1));

Примечание. Это блокирует весь процесс (изолирует), поэтому другие асинхронные функции обрабатываться не будут. Он также недоступен в Интернете, потому что Javascript действительно только асинхронный.

Тимммм
источник
В чем разница между ними (sleep vs Future.delayed)? Что происходит за кулисами в обоих сценариях?
Томас Баран,
3
sleep()полностью блокирует весь изолят. Во время сна код Dart не запускается. Вероятно, он компилируется во что-то вроде C ++ std::this_thread::sleep_for. Future.delayed()планирует возобновление асинхронной функции позже, но затем возвращает управление циклу событий Dart, чтобы другие асинхронные функции могли продолжать работу.
Timmmm
24

Я обнаружил, что в Dart есть несколько реализаций для выполнения задержки кода:

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."));
SpkingR
источник
16

Для синтаксиса Dart 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

Это полезный макет, который может принимать необязательный параметр для имитации ошибки:

  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) {
                ...
            } );
    }
}
Лучано
источник
Это нехорошо, поскольку обычно вы не знаете, сколько времени требуется для завершения обслуживания.
mcfly