Dartプログラムを「スリープ」するにはどうすればよいですか


108

テストのために、Dartアプリケーションで非同期Webサービス呼び出しをシミュレートするのが好きです。応答するこれらのモックコールのランダム性をシミュレートするために(おそらく順序が狂っています)、「Future」を返す前に一定時間待機(スリープ)するようにモックをプログラムしたいと思います。

これどうやってするの?

回答:


116

Future.delayedファクトリを使用して、遅延後に未来を完成させることもできます。遅延後に文字列を非同期に返す2つの関数の例を次に示します。

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

9
目的は () => "1"何ですか?
Daksh Gargas 2018

2
私は
役に立た

1
これらの機能を使用してアプリをスリープ状態にするには、awaitを使用する必要があります。–await sleep1();
スロット

72

2019年版:

非同期コードで

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

同期コード内

import 'dart:io';

sleep(Duration(seconds:1));

注:これはプロセス全体をブロック(分離)するため、他の非同期関数は処理されません。Javascriptは実際には非同期のみであるため、Webでも利用できません。


それらの2つ(sleepとFuture.delayed)の違いは何ですか?両方のシナリオの舞台裏で何が起こっているのですか?
TomasBaran20年

3
sleep()分離株全体を完全にブロックします。スリープ中は、Dartコードはまったく実行されません。おそらくC ++のようなものにコンパイルされますstd::this_thread::sleep_forFuture.delayed()非同期関数を後で再開するようにスケジュールしますが、その後、他の非同期関数を実行し続けることができるように、Dartイベントループに制御を戻します。
Timmmm

68

必ずしも必要なものではありませんが(場合によっては必要な場合もありますFuture.delayed)、Dartコマンドラインアプリで本当にスリープしたい場合は、dart:ioのsleep():を使用できます。

import 'dart:io';

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

良い!残念ながら、この情報は公式サイトでは見つけるのが難しいです。
Timur Fayzrakhmanov 2015年

12
Webアプリケーションを構築している場合、「dart:io」ライブラリは使用できません
adeel41 2015

5
ドキュメントから:[sleep]呼び出しでブロックされている間は、分離で非同期操作を処理できないため、これは注意して使用してください。
bartektartanus 2018

2
警告:これは同期です!!! メインスレッドを停止します!(私は私がしたような愚か者でawait sleep()あり、睡眠中に他の仕事が実行されることを期待しています:(
ch271828n20年

1
それらの2つ(sleepとFuture.delayed)の違いは何ですか?両方のシナリオの舞台裏で何が起こっているのですか?
TomasBaran20年

25

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

17

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

通常、サービスが終了するまでにかかる時間がわからないため、これは良くありません。
マクフライ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.