Dart
的异步对象,类似于 Javascript
中的 Promise
。
Future
表示一个异步操作返回的结果;Future
是一个泛型类;Future
实现异步的原因是通过dart
的event loop
,这里不过多赘述。
基本使用
import 'package:http/http.dart' as http;
Future getIp() {
final url = 'https://httpbin.org/ip';
return http.get(url).then((res) {
return res.body;
});
}
void main() {
getIp().then((res) {
print(res);
}).catchError((err) {
print(err);
});
}
方法
1. then
通过
.then
的形式,获取Future
对象执行成功后的结果。
- 第一个参数
onValue
void main() {
testThen().then((res) {
print(res); // 异步数据
// 可以将数据处理后,继续 return 出去,实现链式调用
return "加工后的${res}";
}).then((res) {
print(res); // 加工后的异步数据
});
}
// 返回一个 Future<String> 对象,其中 String 可以省略,会被 dart 推断出来
Future<String> testThen() {
// return 一个 Future 对象
return new Future(() {
// 发送给 .then 的数据
return "异步数据";
});
}
- 第二个参数
onError
void main() {
testThen().then((res) {
// 不执行 onValue 的方式
print(res);
return "加工后的${res}";
}, onError: (err) {
// 接收到 Future 的错误
print(err); // 这是一个异常
});
}
Future<String> testThen() {
return new Future(() {
throw ('这是一个异常');
});
}
静态方法
Future.delayed()
执行一个延时任务。
void main(List<String> args) {
print('start....');
Future.delayed(Duration(seconds: 3), () => print("延时任务"));
print('end....');
// 执行结果:
// start....
// end....
// 延时任务
}
delayed
中实现的延时操作通过 Timer
来实现的,在实际开发中,如果只是一个单纯的延时操作,建议使用 Timer
。
void main(List<String> args) {
print('start....');
new Timer(Duration(seconds: 3), () => print("延时任务"));
print('end....');
// 执行结果:
// start....
// end....
// 延时任务
}