返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >关于Dart中的异步编程
  • 813
分享到

关于Dart中的异步编程

DartDart异步 2023-05-15 14:05:30 813人浏览 独家记忆
摘要

一 事件循环 Flutter 就是运行在一个root isolate 中 程序只要运行起来,就有一个事件循环一直在运行 ,直至程序退出。 EventLoop 先从mrcro 对列中取

一 事件循环

Flutter 就是运行在一个root isolate 中

程序只要运行起来,就有一个事件循环一直在运行 ,直至程序退出。

EventLoop 先从mrcro 对列中取任务,取完任务再去 event 队列中取任务。队列任务是FIFO。

二 认识Future

abstract class Future<T>

Future 是dart 中提供的一个抽象类,泛型类,它用于封装一段在将来会被执行的代码逻辑。

Future就是异步中非常重要的角色。Future表示异步返回的结果,当执行一个异步延迟的计算时候,首先会返回一个Future结果,后续代码可以继续执行不会阻塞主isolate,当Future中的计算结果到达时,如果注册了 then 函数回调,对于返回成功的回调就会拿到最终计算的值,对于返回失败的回调就会拿到一个异常信息

1  基本使用

Flutter提供了下面三个方法,让我们来注册回调,来监听处理Future的结果。

//处理完成时候的回调,一般都是成功回调
Future<R> then<R>(FutureOr<R> onValue(T value), {Function onError});
//处理失败的回调,比如throw一个error就会走到这里
Future<T> catchError(Function onError, {bool test(Object error)});
//Future.whenComplete总是在Future完成后调用,不管Future的结果是正确的还是错误的。
Future<T> whenComplete(FutureOr action());

 代码示例:

import 'dart:io';
 
main(List<String> args) {
  // 阻塞主线程的调用
  // blockMainThread();
  // 异步调用
  asyncMethod();
}
 

void asyncMethod() {
  
  print("main start");
  var future = getAsyncNetworkData();
  future.then((String value) {
    // 只有拿到结果 才会执行这里面的代码
    print(value);
  }).catchError((error) {
    // 打印结果 Exception: 我是错误信息
    print(error);
  }).whenComplete(() {
    // 代码走这,不管成功或者失败都会走这里
    print("代码执行完毕");
  });
  print("main end");
}
 
Future<String> getAsyncNetworkData() {
  return Future<String>(() {
    sleep(Duration(seconds: 3));
    // return "hello world";
 
    // 抛出异常
    throw Exception("我是错误信息");
  });
}
 

void blockMainThread() {
  
  print("main start");
  var res = getNetworkData();
  print(res);
  print("main end");
}
 
// 模拟网络请求
String getNetworkData() {
  // 阻塞2秒
  sleep(Duration(seconds: 2));
  return "this is hello world";
}

2 链式调用

  链式调用优势在于可以明确代码执行前后依赖关系以及实现异常的捕获

import 'dart:io';
 
main(List<String> args) {
  print("main start");
  
  // 这种方式可以解决回调地狱的问题 多个网络请求依赖也不用进行嵌套调用 直接链式调用即可
  Future(() {
    // 这是第一次网络请求
    sleep(Duration(seconds: 2));
    return "第一次网络请求的结果";
  })
      .then((res) {
        print(res);
        sleep(Duration(seconds: 2));
        // 这是第二次网络请求
        return "第二次网路请求的结果";
      })
      .then((res) {
        print(res);
        sleep(Duration(seconds: 2));
        return "第三次网路请求的结果";
      })
      .then((value) => print(value))
      .catchError((error) {
        print(error);
      });
  print("main end");
}

三 await 和 async

要定义异步函数,请在函数主体之前添加async关键字,他俩是配对出现的

他们是dart 语言中的关键字,最为重要的使用就是

可以让我们用同步的代码格式去实现异步的调用过程。  

大部分Future使用的场景都可以使用async-await来替代,也建议使用async-await。

下面有这样一个需求 :比如说用户登录完成之后,拿到用户的token 去请求数据,就是请求之间的依赖

用 await async 方式实现 和 Future 实现比较

import 'dart:io';
 
main(List<String> args) {
  print("main start");
  // getData();
  futureMethodData();
  print("main end");
}
 
// future 的实现方式
futureMethodData() {
  Future(() {
    // 这是第一次网络请求
    sleep(Duration(seconds: 2));
    return "这是第一次网络请求结果";
  }).then((value) {
    print(value);
    sleep(Duration(seconds: 2));
    return value + "这是第二次网络请求结果";
  }).then((value) {
    print(value);
    sleep(Duration(seconds: 2));
    return value + "这是第三次网络请求结果";
  }).then((value) {
    print(value);
  });
}
 
// async-await 的实现方式
getData() async {
  // 模拟三次网络请求
  
  var res1 = await getNetworkData("args1");
  print(res1);
  var res2 = await getNetworkData(res1);
  print(res2);
  var res3 = await getNetworkData(res2);
  print(res3);
}
 
getNetworkData(String args) {
  return Future(() {
    sleep(Duration(seconds: 2));
    return args + "helloworld";
  });
}

四 isolate

isolate  可以理解为dart 中的多线程,现在设备基本都是多核CPU,可以使用isolate 充分利用硬件资源。

isolate 之间是独立的,资源不共享的。每一个isaolate 都有自己的事件循环以及队列。

1 使用

import 'dart:io';
import 'dart:isolate';
 
main(List<String> args) async {
  print("main start");
  // 1
  ReceivePort receivePort = ReceivePort();
  // 2  spawn 返回的是future 所以要异步操作
  Isolate isolate =
      await Isolate.spawn<SendPort>(calculate, receivePort.sendPort);
 
  // 可以给创建的isolate 中发送消息
  receivePort.sendPort.send("这是从main isolate 发送的消息");
 
  //3 监听创建的isolate的回调信息
  receivePort.listen((message) {
    print(message);
    // 收到结果 关闭 kill
    receivePort.close();
    isolate.kill();
  });
 
  print("main end");
}
 
calculate(SendPort port) {
  // 模拟耗时操作
  sleep(Duration(seconds: 2));
  // 回调信息
  port.send("这是从创建的isolate 发送的信息");
}

到此这篇关于关于Dart中的异步编程的文章就介绍到这了,更多相关Dart中的异步内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于Dart中的异步编程

本文链接: https://lsjlt.com/news/209126.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 关于Dart中的异步编程
    一 事件循环 flutter 就是运行在一个root isolate 中 程序只要运行起来,就有一个事件循环一直在运行 ,直至程序退出。 EventLoop 先从mrcro 对列中取...
    99+
    2023-05-15
    Dart Dart异步
  • Dart中的异步编程怎么使用
    这篇文章主要讲解了“Dart中的异步编程怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dart中的异步编程怎么使用”吧!一 事件循环flutter 就是运行在一个root isola...
    99+
    2023-07-06
  • ASP异步编程教程:你是否想要了解更多关于异步编程的知识?
    在ASP.NET中,异步编程是一种非常常见的编程模式。使用异步编程可以提高应用程序的性能和响应速度。在本教程中,我们将介绍ASP异步编程的基础知识和实践技巧。 什么是异步编程? 在传统的同步编程中,当一个操作开始执行时,程序会一直等待这个...
    99+
    2023-07-05
    异步编程 教程 框架
  • Python编程中框架与异步编程的密切关系。
    Python编程中框架与异步编程的密切关系 Python是一种高级编程语言,被广泛应用于各种领域,如Web开发、数据分析、人工智能等。Python编程中框架和异步编程是两个重要的概念,它们在Python编程中的应用非常广泛,本文将介绍它们之...
    99+
    2023-06-18
    编程算法 框架 异步编程
  • Dart 异步编程生成器及自定义类型用法详解
    目录异步支持FutureFuture.thenFuture.catchErrorFuture.whenCompleteFuture.waitasync 和 await处理流(Stre...
    99+
    2022-11-13
    Dart 异步编程生成器 Dart 自定义类型
  • 关于Vue的异步组件
    基本用法​ 在大型项目中,我们可能需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件。Vue 提供了defineAsyncComponent方法来实现此功能: import ...
    99+
    2023-05-17
    Vue异步 Vue组件
  • C#5.0中的异步编程关键字async和await
    一、Asynchronous methods 异步方法 .NET 4.5 的推出,对于C#又有了新特性的增加——就是C#5.0中async和await两个关键...
    99+
    2024-04-02
  • 如何在Java面试中回答关于索引和异步编程的问题?
    在Java面试中,面试官通常会询问你关于索引和异步编程的问题。这些问题非常重要,因为它们涉及到Java编程中的关键概念和技术。在本文中,我们将深入探讨如何回答这些问题,并提供一些演示代码。 一、索引 索引是一种用于优化数据库查询性能的技术。...
    99+
    2023-06-15
    面试 索引 异步编程
  • ASP和异步编程有何关联?
    ASP和异步编程有何关联? ASP(Active Server Pages)是一种由微软开发的动态网页技术,使用VBScript或JScript语言编写服务器端脚本,生成HTML网页供客户端浏览器访问。而异步编程则是一种编程模型,通过异步方...
    99+
    2023-11-07
    异步编程 自然语言处理 numpy
  • 关于React中setState同步或异步问题的理解
    目录1. setState同步?异步? 2. 表现为异步 1. React 合成事件 2. 生命周期函数 3. 表现为同步 1. 原生事件 2. setTimeout 4. setS...
    99+
    2024-04-02
  • .NET2.0版本中基于事件的异步编程模式(EAP)
    一、引言 APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说...
    99+
    2024-04-02
  • Java 异步编程:快速掌握异步编程的精髓!
    Java 是一种高度可扩展的编程语言,拥有大量的库和框架,使得开发人员能够快速构建复杂的应用程序。其中,异步编程是 Java 中非常重要的一种编程模型,可以帮助我们构建高效、高性能的应用程序。本文将介绍 Java 异步编程的基本概念,并演...
    99+
    2023-09-29
    异步编程 打包 load
  • Java异步编程:提高程序性能的关键?
    在日常的开发中,我们经常会遇到需要执行耗时操作的情况,例如网络请求、文件读写等。如果我们在主线程中执行这些操作,就会出现界面卡顿、响应缓慢等问题,影响用户体验。而Java异步编程可以帮助我们解决这些问题,提高程序性能。本文将介绍Java异...
    99+
    2023-08-24
    异步编程 打包 numy
  • Python 异步编程:关键字是什么?
    随着计算机技术的不断发展,人们对于计算机性能的要求也越来越高。然而,单线程的编程模式很难满足这种要求,因为它只能串行地执行代码,无法充分利用多核处理器的性能。因此,人们开始寻求一种更加高效的编程模式,即异步编程。 Python 作为一门高...
    99+
    2023-10-02
    异步编程 关键字 教程
  • Java 异步编程教程:异步编程对于网络通信的响应速度有多大影响?
    随着技术的不断进步,网络通信已经成为了我们日常生活中不可或缺的一部分。在这个信息时代,我们需要更快更高效的网络通信方式,以满足人们对于网络传输速度的需求。而异步编程就是一种能够提高网络通信效率的方式。 在传统的同步编程中,当一个线程执行一...
    99+
    2023-06-25
    异步编程 教程 http
  • 如何在 Python 中使用异步编程关键字?
    在 Python 中,异步编程是一种非常流行的编程方式。它可以提高程序的性能和响应速度,特别是在处理大量 I/O 操作时。Python 3.5 引入了 async 和 await 关键字,使得异步编程变得更加容易。 在本文中,我们将介绍如何...
    99+
    2023-10-02
    异步编程 关键字 教程
  • Java 异步编程教程:如何在http请求中实现异步编程?
    随着互联网技术的不断发展,越来越多的应用需要处理大量的网络请求。而在高并发场景下,同步的网络请求会导致线程阻塞,从而降低应用的性能。因此,采用异步编程模式可以有效地提高应用的性能和并发能力。本文将为你介绍如何在Java中实现异步编程,并通...
    99+
    2023-06-25
    异步编程 教程 http
  • Laravel文件异步编程:PHP异步编程的最佳实践?
    在现代应用程序开发中,异步编程已成为一种越来越流行的技术。它可以提高应用程序的性能,使其更加可扩展,并改善用户体验。在PHP开发中,使用异步编程技术可以将代码的执行从阻塞模式切换到非阻塞模式,从而提高应用程序的响应速度和吞吐量。 在这篇文...
    99+
    2023-10-05
    异步编程 文件 laravel
  • 您需要了解的关于PHP异步编程和Spring API的重要信息。
    PHP异步编程和Spring API是两个非常重要的主题,尤其是在现代Web应用程序的开发中。在本文中,我们将探讨这两个主题,并提供一些代码示例,帮助您更好地了解这些概念。 PHP异步编程 PHP是一种流行的Web开发语言,而异步编程是一种...
    99+
    2023-10-04
    异步编程 spring api
  • C#实现基于任务的异步编程模式
    目录一.延续任务二.同步上下文三.使用多个异步方法1.按顺序调用异步方法2.使用组合器四.转换异步模式五.错误处理1.异步方法的异常处理2.多个异步方法的异常处理3.使用Aggreg...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作