如何“休眠” Dart程序


102

我喜欢在Dart应用程序中模拟一个异步Web服务调用以进行测试。为了模拟这些模拟调用响应的随机性(可能是无序的),我想对模拟程序进行编程,使其在返回“未来”之前等待(睡眠)一段时间。

我怎样才能做到这一点?

Answers:


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
我想没有用,这只是占位符,您可以

要使用这些功能,睡你的应用程序,你需要使用的await:await sleep1();
插槽

67

它并不总是您想要的(有时是您想要的Future.delayed),但是如果您真的想在Dart命令行应用程序中睡觉,则可以使用dart:io sleep()

import 'dart:io';

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

好!不幸的是,这些信息很难在官方网站上找到。
Timur Fayzrakhmanov

11
如果您正在构建Web应用程序,则'dart:io'库不可用
adeel41

4
来自文档:谨慎使用此方法,因为在[sleep]调用中被阻止时,无法单独处理任何异步操作
bartektartanus

1
警告:这是同步的!!!它将停止主线程!(我像傻瓜那样做,await sleep()并期望其他工作在睡觉时运行:(
ch271828n

1
他们两个之间的区别是什么(sleep vs Future.delayed)?在这两种情况下,幕后发生了什么?
Tomas Baran

63

2019年版:

在异步代码中

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

同步码中

import 'dart:io';

sleep(Duration(seconds:1));

注意:这会阻塞整个过程(隔离),因此将不会处理其他异步功能。它也无法在网络上使用,因为Javascript实际上仅是异步的。


他们两个之间的区别是什么(sleep vs Future.delayed)?在这两种情况下,幕后发生了什么?
Tomas Baran

3
sleep()完全阻止整个隔离。休眠状态下根本不会运行Dart代码。它可能会编译为类似C ++的东西std::this_thread::sleep_forFuture.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.