首页 > 其他分享 >Future异步

Future异步

时间:2024-01-17 09:58:40浏览次数:29  
标签:异步 getNetworkData value Future print async

在其他语言,比如java、c++中, 同时要执行多个任务可以使用多线程来实现。而在Dart语言中没有线程 和进程的概念 ,它是单线程+事件循环的设计模式,Dart和Flutter中要同时执行多个任务可以使用异步 来实现,Flutter中主要使用Future来实现异步操作 。

 Future 返回值 
Future 是一个泛型,其中T代表的是我们耗时操作返回的具体值,如Future 表示一个未来的字符串, Future表示一个未来的布尔值,如果不需要返回值,可以使用Future。
  • Future.value():返回一个指定值的Future
  • Future.delayed():返回一个延时执行的Future
  • Future(() { ... return ... }) 返回异步的function  * 最多
Flutter自带的Demo中有个计数器的功能,我们想的是执行计数器方法的时候让程序并行的去执行另一 个统计的任务,这个时候就可以使用Future来完成。 
Future<String> getNetworkData() {
    return Future(() {
    //执行其他耗时操作
    int result = 0;
    for (int i = 0; i < 100000; i++) {
    result += i;
   }
    return "result:$result";
   });
}

void _incrementCounter() {
       getNetworkData().then((value) => print(value));
       print("执行");
       setState(() {
      _counter++;
    });
}
 Future 处理异常 
异常处理使我们在开发中特别需要注意的,正确的处理程序运行中的异常,能给用户带来更好的体验   在future中可以使用catchError()或在then()方法中传入可选参数onError 来处理异常,可以使用 whenComplete监听完成事件。 
//抛出异常
Future<String> getNetworkData() {
    Future.delayed(const Duration(seconds: 3));
    return Future.error(Exception("this is error"));
}

//捕获异常
void _incrementCounter() {
     getNetworkData()
         .then((value) => print(value))
         .onError((error, stackTrace) => {print(error)})
         .whenComplete(() => print("完成"));
      print("执行");
      setState(() {
      _counter++;
    });
}
 Future .then连缀来处理多个事务
Future<int> getNetworkData() {
return Future.value(12);
}

//处理
void _incrementCounter() {
   getNetworkData()
       .then((value){
           return value*2;  //12 * 2
       })
       .then((value) => print(value))  //打印24
       .onError((error, stackTrace) => {
         print(error)  //打印异常
       })
       .whenComplete(() => print("完成"));
}
async和await关键字来处理future
作用:
  1.  async:在方法体前面是使用,定义该方法为一个异步方法。
  2.  await:等待并获得异步表达式的执行结果,并且给关键字只能在async修饰的方法中。 
Future<int> getNetworkData(){
   return Future.value(12);
}

//依次执行   async:把方法定义为异步  await:把异步改为同步
void _incrementCounter() async{
   var retult =await getNetworkData();  //把异步改成同步 await必须用在async中
   print(retult);
   print("执行");
}
处理async方法中的异常
对于async中的方法的异常,我们按以下方式进行处理: 
  Future<int> getNetworkData() {
    return Future.error(Exception("this is errot"));
  }

  void _incrementCounter() async {
    try {
      var retult = await getNetworkData();
      print(retult);
    } catch (e) {
      print(e); //异常
    }
  }

 

标签:异步,getNetworkData,value,Future,print,async
From: https://www.cnblogs.com/xbinbin/p/17969128

相关文章

  • Flink异步IO
    本文讲解Flink用于访问外部数据存储的异步I/OAPI。对于不熟悉异步或者事件驱动编程的用户,建议先储备一些关于Future和事件驱动编程的知识。对于异步I/O操作的需求在与外部系统交互(用数据库中的数据扩充流数据)的时候,需要考虑与外部系统的通信延迟对整个流处理应用的影响......
  • Python 异步编程原理篇之新旧协程实现对比
    协程的发展流程再来回顾一下协程的发展流程:python2.5为生成器引用.send()、.throw()、.close()方法python3.3为引入yieldfrom,可以接收返回值,可以使用yieldfrom定义协程Python3.4加入了asyncio模块Python3.5增加async、await关键字,在语法层面的提供支持python3.7使用......
  • C# 对两个需要顺序执行的函数进行异步交叉,提高执行速度
    有的时候我们会有2个函数需要顺序执行,比如将数据库的数据写到硬盘上,读数据库和写硬盘都是IO比较慢的操作,于是我们很容易就想到让他们异步执行,避免阻塞,提高性能,但是为了保证数据的顺序一致,我们又需要整个队列来存放数据,感觉比较麻烦,今天研究了下,通过异步和信号量控制实现了两个函......
  • 关于gunicorn与异步兼容性问题:AttributeError: module 'select' has no attribute 'ep
    关于gunicorn与异步兼容性问题:AttributeError:module'select'hasnoattribute'epoll'背景:介绍:  在使用gunicorn、Flask&flask-sockets部署,实现websocket协议中同类消息阻塞,不同类消息不阻塞场景。异常:[2024-01-1510:22:16+0800][31655][ERROR]Ex......
  • 定时任务及异步,自定义注解进行参数校验
    简单来说:浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。 如何在Spring/SpringBoot中优雅地做参数校验?springboot项目使用validation-api......
  • CompletableFuture多线程与redis分布式锁
    @AutowiredpublicRedisTemplateredisTemplate;booleanlock=redisTemplate.opsForValue().setIfAbsent("lock","redisLock");//获取锁      booleanredisLock=redis.getRedisLock();      if(redisLock){        //创建线......
  • JUC并发编程 CompletableFuture 获得结果和触发计算 常用方法(二)
    1获得结果和触发计算1.1获取结果publicTget()publicTget(longtimeout,TimeUnitunit)publicTjoin()--->和get一样的作用,只是不需要抛出异常publicTgetNow(TvaluelfAbsent)--->计算完成就返回正常值,否则返回备胎值(传入的参数),立即获取结果不阻塞1......
  • JUC并发编程 CompletableFuture 业务代码实战
    1需求电商网站比价需求分析:1.1需求说明:a.同一款产品,同时搜索出同款产品在各大电商平台的售价b.同一款产品,同时搜索出本产品在同一个电商平台下,各个入驻卖家售价是多少1.2输出返回:a.出来结果希望是同款产品的在不同地方的价格清单列表,返回一个List例如:《Mysql》......
  • 异步FIFO设计
    同步FIFO设计思路方法1:使用计数器记录FIFO有效数据,从而产生空满信号方法2:指针空间扩大一倍,读写指针最高位相同为空,最高位不同,剩下数据位相同为满异步FIFO设计读写指针分别在各自的时钟域进行维护读空的时候需要在读时钟域进行判断,写满的时候需要在写时钟域进行判断......
  • JUC并发编程 用CompletableFuture 创建异步任务
    1CompletableFuture对Future的改进1.1CompletableFuture为什么会出现get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。isDene()方法容易耗费cpu资源(cpu空转),对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动......