前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dart学习 Future 异步/ Isolate 隔离

Dart学习 Future 异步/ Isolate 隔离

原创
作者头像
KID.
发布2024-01-31 11:08:58
1170
发布2024-01-31 11:08:58
举报

Dart 中的并发

Futrue 如果使用了async 异步亲求,返回的类型一定要是Future类型的。

Future 调用类似于 promise ,相当于是微任务。

代码语言:javascript
复制
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

除了可以使用async和awite Future 也可以使用.then .cacth来获取结果。类似返回一个promise对象

代码语言:javascript
复制
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

// 模拟请求

Future 也可以像promise一样链式调用。之前js的写法是可以的 还可以return 另一个Future对象,进行链式调用

代码语言:javascript
复制
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的链式调用

代码语言:javascript
复制
void main(List<String> args) async{

 String value = await req();

 String value2 = await req2(value2);

 print(value);

 print(value2);

}

Future.wait 类似于Promise.all

这里调用上面写过的两个方法,结果是两个返回值组成的数组

代码语言:javascript
复制
void main(List<String> args) {

 Future.wait([req(), req2(23)]).then((value) {

 print(value);

 // 等待传入的异步都执行完毕再操作

  });

}
代码语言:javascript
复制
void main(List<String> args) async{

 var res = Future.wait([req(), req2(23)])

 print(res);

}

Ioslate 隔离

将原本单线程的内容模拟成“多线程”,在主线程中创建新的隔离执行耗时任务,不会阻塞主线程的执行,执行完成后再通过管道将结果输送给主线程

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Dart 中的并发
    • Futrue 如果使用了async 异步亲求,返回的类型一定要是Future类型的。
      • 除了可以使用async和awite Future 也可以使用.then .cacth来获取结果。类似返回一个promise对象
      • Future 也可以像promise一样链式调用。之前js的写法是可以的 还可以return 另一个Future对象,进行链式调用
      • Future.wait 类似于Promise.all
  • Ioslate 隔离
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档