Future 调用类似于 promise ,相当于是微任务。
void main(List<String> args) {
print('start');
Future(() { // 异步执行
print('111111111');
? });
Future.sync(() { // 同步执行
print('22222');
? });
Future.delayed(Duration(seconds: 2), () { // 可以指定延迟多久执行
print('3333333');
? });
print('end');
}
// 打印结果
// start
// 22222
// end
// 111111111
// 22222
.then
.cacth
来获取结果。类似返回一个promise对象import 'dart:io';
void main(List<String> args) {
print('start');
req().then((value) {
print(value);
? });
print('end');
}
Future req() {
return Future(() {
sleep(Duration(seconds: 2));
return '模拟请求';
? });
}
// 打印结果
// start
// end
// 模拟请求
import 'dart:io';
void main(List<String> args) {
// req().then((value) {
// ? print(value);
// ? req2(value).then((v2) {
// ? ? print(v2);
// ? });
// });
// 返回一个新的Future ?可以进行链式调用 与上面的写法 结果一致
req().then((value) {
print(value);
return req2(value);
? }).then((value) {
print(value);
? });
}
Future req() {
return Future(() {
sleep(Duration(seconds: 2));
return '模拟请求';
? });
}
Future req2(value) {
return Future(() {
sleep(Duration(seconds: 2));
return '第二个请求';
? });
}
也可以使用async 和 await,将异步代码同步的写出,去掉了.then的链式调用
void main(List<String> args) async{
String value = await req();
String value2 = await req2(value2);
print(value);
print(value2);
}
这里调用上面写过的两个方法,结果是两个返回值组成的数组
void main(List<String> args) {
Future.wait([req(), req2(23)]).then((value) {
print(value);
// 等待传入的异步都执行完毕再操作
? });
}
void main(List<String> args) async{
var res = Future.wait([req(), req2(23)])
print(res);
}
将原本单线程的内容模拟成“多线程”,在主线程中创建新的隔离执行耗时任务,不会阻塞主线程的执行,执行完成后再通过管道将结果输送给主线程
import 'dart:io';
import 'dart:isolate';
void main(List<String> args) async {
print('start');
// 通过自带的ioslate 中的ReceivePort 来创建管道,需要再Isolate.spawn 第二个参数传入。
ReceivePort port = ReceivePort();
// 创建隔离,传入执行的任务,一级管道
var taskres = await Isolate.spawn(task, port.sendPort);
// 通过listen 方法接收 send传递的内容。
? port.listen((message) {
print(message);
// 操作结束后要关闭管道
? ? port.close();
// 杀死线程
? ? taskres.kill();
? });
print('end');
}
void task(SendPort port) {
sleep(Duration(seconds: 2));
// 隔离的参数返回内容需要调用 port.send
return port.send('task finash');
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。