Як я можу “заснути” програмою Dart


102

Мені подобається імітувати асинхронний дзвінок веб-служби в моєму додатку Dart для тестування. Для імітації випадковості відповідей на ці фіктивні дзвінки (можливо, не в порядку), я хотів би запрограмувати мої макети на очікування (сплячий режим) протягом певного періоду часу, перш ніж повертати "Майбутнє".

Як я можу це зробити?

Відповіді:


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"?
Daksh Gargas

2
Думаю, користі немає, це просто заповнювач для обчислення
Anil8753

66

Це не завжди те, що ви хочете (іноді ви хочете Future.delayed), але якщо ви дійсно хочете спати у своєму додатку командного рядка Dart, ви можете використовувати dart: io's sleep():

import 'dart:io';

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

Добре! На жаль, цю інформацію важко знайти на офіційному сайті.
Тимур Файзрахманов

11
Бібліотека 'dart: io' недоступна, якщо ви створюєте веб-додаток
adeel41,

4
З документів: Використовуйте це обережно, оскільки жодні асинхронні операції не можуть бути оброблені в ізоляторі, коли він заблокований під час виклику [сплячого].
bartektartanus

1
ПОПЕРЕДЖЕННЯ : Це синхронно !!! Це зупинить основну нитку! (Я такий дурень, що робив, await sleep()і очікую, що інші роботи працюють під час сну :(
ch271828n

1
Яка різниця між ними двома (sleep vs Future.delayed)? Що відбувається за лаштунками в обох сценаріях?
Томаш Баран,

62

Видання за 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, щоб інші асинхронні функції могли продовжувати працювати.
Тімммм,

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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.