我喜欢在Dart应用程序中模拟一个异步Web服务调用以进行测试。为了模拟这些模拟调用响应的随机性(可能是无序的),我想对模拟程序进行编程,使其在返回“未来”之前等待(睡眠)一段时间。
我怎样才能做到这一点?
Answers:
您还可以使用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");
}
await sleep1();
它并不总是您想要的(有时是您想要的Future.delayed
),但是如果您真的想在Dart命令行应用程序中睡觉,则可以使用dart:io 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"
什么?