181

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

我怎样才能做到这一点?

4

7 回答 7

204

2019 edition:

In Async Code

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

In Sync Code

import 'dart:io';

sleep(Duration(seconds:1));

Note: This blocks the entire process (isolate), so other async functions will not be processed. It's also not available on the web because Javascript is really async-only.

于 2019-11-15T10:54:33.017 回答
157

您还可以使用 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");
}
于 2013-08-26T21:46:29.930 回答
75

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

import 'dart:io';

main() {
  sleep(const Duration(seconds:1));
}
于 2015-02-27T23:59:06.513 回答
31

我发现 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."));
于 2018-05-22T06:53:36.950 回答
21

对于 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);
} 
于 2019-03-27T03:27:37.557 回答
6

这是一个有用的模拟,可以采用可选参数来模拟错误:

  Future _mockService([dynamic error]) {
    return new Future.delayed(const Duration(seconds: 2), () {
      if (error != null) {
        throw error;
      }
    });
  }

你可以像这样使用它:

  await _mockService(new Exception('network error'));
于 2018-10-19T08:56:56.093 回答
0

你可以这样使用: 在此处输入图像描述

sleep(Duration(seconds: 5));

或者

  Future.delayed(const Duration(seconds: 5));
于 2022-02-20T06:59:38.497 回答