테스트를 위해 Dart 애플리케이션에서 비동기 웹 서비스 호출을 시뮬레이션하고 싶습니다. 응답하는 모의 호출의 무작위성을 시뮬레이션하기 위해 (아마도 순서가 맞지 않음) '미래'를 반환하기 전에 일정 시간 동안 대기 (수면)하도록 내 모의를 프로그래밍하고 싶습니다.
어떻게 할 수 있습니까?
답변:
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");
}
항상 원하는 것은 아니지만 (때로는 원하는 경우도 있음 Future.delayed
) Dart 명령 줄 앱에서 잠을 자고 싶다면 dart : io 's를 사용할 수 있습니다 sleep()
.
import 'dart:io';
main() {
sleep(const Duration(seconds:1));
}
await sleep()
2019 년 판 :
await Future.delayed(Duration(seconds: 1));
import 'dart:io';
sleep(Duration(seconds:1));
참고 : 이렇게하면 전체 프로세스 (격리)가 차단되므로 다른 비동기 함수는 처리되지 않습니다. Javascript는 실제로 비동기 전용이기 때문에 웹에서도 사용할 수 없습니다.
sleep()
전체 격리를 완전히 차단합니다. 잠자는 동안에는 Dart 코드가 전혀 실행되지 않습니다. 아마도 C ++의 std::this_thread::sleep_for
. Future.delayed()
나중에 재개하도록 비동기 함수를 예약하지만 다른 비동기 함수가 계속 실행될 수 있도록 Dart 이벤트 루프에 제어를 반환합니다.
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."));
또한 단위 테스트 중에 서비스가 완료 될 때까지 기다려야했습니다. 이 방법으로 구현했습니다.
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) {
...
} );
}
}
() => "1"
무엇입니까?