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
나는 아무 소용을 생각하지, 당신의 computaions을 그냥 자리 표시 자입니다
Anil8753

66

항상 원하는 것은 아니지만 (때로는 원하는 경우도 있음 Future.delayed) Dart 명령 줄 앱에서 잠을 자고 싶다면 dart : io 's를 사용할 수 있습니다 sleep().

import 'dart:io';

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

좋은! 안타깝게도이 정보는 공식 사이트에서 찾기가 어렵습니다.
Timur Fayzrakhmanov

11
웹 애플리케이션을 빌드하는 경우 'dart : io'라이브러리를 사용할 수 없습니다
adeel41

4
문서에서 : [sleep] 호출에서 차단 된 동안에는 비동기 작업을 격리에서 처리 할 수 ​​없으므로 주의해서 사용하십시오 .
bartektartanus

1
경고 : 이것은 동 기적입니다 !!! 메인 스레드를 중지합니다! (나는 내가 한 바보 await sleep()
같고

1
두 사람의 차이점은 무엇입니까 (sleep vs Future. 지연)? 두 시나리오 모두 뒤에서 무슨 일이 일어나고 있습니까?
Tomas Baran

62

2019 년 판 :

비동기 코드에서

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

동기화 코드에서

import 'dart:io';

sleep(Duration(seconds:1));

참고 : 이렇게하면 전체 프로세스 (격리)가 차단되므로 다른 비동기 함수는 처리되지 않습니다. Javascript는 실제로 비동기 전용이기 때문에 웹에서도 사용할 수 없습니다.


두 사람의 차이점은 무엇입니까 (sleep vs Future. 지연)? 두 시나리오 모두 뒤에서 무슨 일이 일어나고 있습니까?
Tomas Baran

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

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.