异步 “一发入魂“

news2024/9/21 22:32:35

异步

概述:

异步就是从主线程发射一个子线程来完成任务

img

什么时候用异步编程

主线程作为一个线程,不能够同时接受多方面的请求。所以,当一个事件没有结束时,界面将无法处理其他请求。

为了避免这种情况的发生,我们常常用子线程来完成一些可能消耗时间足够长以至于被用户察觉的事情,

比如读取一个大文件或者发出一个网络请求。因为子线程独立于主线程,所以即使出现阻塞也不会影响主线程的运行。但是子线程有一个局限:一旦发射了以后就会与主线程失去同步,我们无法确定它的结束,如果结束之后需要处理一些事情,比如处理来自服务器的信息,我们是无法将它合并到主线程中去的。

为了解决这个问题,JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理。

回调函数

回调函数就是一个函数,它是在我们启动一个异步任务的时候就告诉它:

等你完成了这个任务之后要干什么。这样一来主线程几乎不用关心异步任务的状态了,他自己会善始善终。

function print() {
    document.getElementById("demo").innerHTML="RUNOOB!";
}
setTimeout(print, 3000);

这段程序中的 setTimeout 就是一个消耗时间较长(3 秒)的过程,它的第一个参数是个回调函数第二个参数毫秒数,这个函数执行之后会产生一个子线程,子线程会等待 3 秒,然后执行回调函数 “print”,在命令行输出 “RUNOOB!”

也可以直接写成:

setTimeout(function () {
    document.getElementById("demo").innerHTML="RUNOOB!";
}, 3000);

这样就实现了我们的子线程等待3秒才执行,但不耽搁我们的主线程执行

setTimeout(function () {
    document.getElementById("demo1").innerHTML="RUNOOB-1!";  // 三秒后子线程执行
}, 3000);
document.getElementById("demo2").innerHTML="RUNOOB-2!";      // 主线程先执行

img

Promise

概述:

Promise 是一种用于处理异步操作的对象。Promise 表示一个操作的最终完成(或失败)及其结果值

通过 new Promise 来创建一个 Promise 实例。

它接受一个执行函数,该函数包含两个参数:resolvereject

resolve 用于将 Promise 的状态变为已完成,并传递结果;

reject 用于将状态变为已拒绝,并传递错误。

function aa(){
  const promise:Promise<string> = new Promise((resolve, reject) => {
    // 异步操作
    setTimeout(() => {
      if (Math.random() < 0.5) {
        resolve('success');
      } else {
        reject('error');
      }
    }, 1000);
  });
//获取返回值
  promise.then(result => {
    console.log('aa',result);
  }).catch((err:BusinessError)=>{
    console.log('aa',err);
  });
}

上面的例子中,我们使用 Promise 构造函数创建了一个 Promise 对象,并使用 setTimeout 模拟了一个异步操作。

1、如果异步操作成功,则调用 resolve 函数并传递成功的结果

2、如果异步操作失败,则调用 reject 函数并传递失败的原因。

3、然后我们使用 then 方法处理 Promise 成功状态的回调函数使用 catch 方法处理 Promise 失败状态的回调函数

这段程序会直接输出 errorsuccess

resolve 和 reject 都是函数,其中调用 resolve 代表一切正常reject 是出现异常时所调用

回答常见的问题(FAQ)

Q: then、catch 和 finally 序列能否顺序颠倒?

A: 可以,效果完全一样。但不建议这样做,最好按 then-catch-finally 的顺序编写程序。

Q: 除了 then 块以外,其它两种块能否多次使用?

A: 可以,finally 与 then 一样会按顺序执行,但是 catch 块只会执行第一个,除非 catch 块里有异常。所以最好只安排一个 catch 和 finally 块。

Q: then 块如何中断?

A: then 块默认会向下顺序执行,return 是不能中断的,可以通过 throw 来跳转至 catch 实现中断。

Q: 什么时候适合用 Promise 而不是传统回调函数?

A: 当需要多次顺序执行异步操作的时候,例如,如果想通过异步方法先后检测用户名和密码,需要先异步检测用户名,然后再异步检测密码的情况下就很适合 Promise。

Q: Promise 是一种将异步转换为同步的方法吗?

A: 完全不是。Promise 只不过是一种更良好的编程风格。

Q: 什么时候我们需要再写一个 then 而不是在当前的 then 接着编程?

A: 当你又需要调用一个异步任务的时候。

Promise 类有 .then() .catch() 和 .finally() 三个方法,

这三个方法的参数都是一个函数,

.then() 可以将参数中的函数添加到当前 Promise 的正常执行序列,

.catch() 则是设定 Promise 的异常处理序列,

.finally() 是在 Promise 执行的最后一定会执行的序列。

.then() 传入的函数会按顺序依次执行,有任何异常都会直接跳到 catch 序列:

new Promise(function (resolve, reject) {
    console.log(1111);
    resolve(2222);
}).then(function (value) {
    console.log(value);
    return 3333;
}).then(function (value) {
    console.log(value);
    throw "An error";
}).catch(function (err) {
    console.log(err);
});

写一个方法测试一下:

//传入两个参数一个延时时间,一个打印的日志
function cc(delay:number, message:string) {
  const  promise:Promise<string>=new Promise((resolve, reject)=> {
    setTimeout(()=> {
      console.log('ccc',message);
      resolve('123');
    }, delay);
  });
  return promise.then(result => {
    console.log('ccc',result);
  });
    .catch((err:BusinessError)=>{
      console.log('ccc',err)
    });
}

如果用普通方式写一直调用.then属性

print(1000, "First")
    .then(function () {
    	return print(4000, "Second");
	})
    .then(function () {
   		 print(3000, "Third");
	});

这时候我们就可以用acync await更加简洁

async function asyncFunc() {
    await print(1000, "First");
    await print(4000, "Second");
    await print(3000, "Third");
}

//再调用该方法
asyncFunc();

异步函数 async function 中可以使用 await 指令,await 指令后必须跟着一个 Promise,异步函数会在这个 Promise 运行中暂停,直到其运行结束再继续运行。

异步函数实际上原理与 Promise 原生 API 的机制是一模一样的,只不过更便于程序员阅读。

处理异常的机制将用 try-catch 块实现:

//js
async function asyncFunc() {
    try {
        await new Promise(function (resolve, reject) {
            throw "Some error"; // 或者 reject("Some error")
        });
    } catch (err) {
        console.log(err);
        // 会输出 Some error
    }
}

//ArkTs
async function asyncFunc1() {
  try {
    await Promise.reject('报错信息')
  } catch (err) {
    console.log('asyncFunc1',err);
    // 会输出 ‘报错信息’
  }
}

//方法调用
asyncFunc();

image-20240904002346310

如果 Promise 有一个正常的返回值,await 语句也会返回它:

/*js里面是这样写的
 * async function asyncFunc() {
    let value = await new Promise(
        function (resolve, reject) {
            resolve("Return value");
        }
    );
    console.log(value);
}
 */

//arkTs是这样写的
async function asyncFunc() {
  const result = await Promise.resolve('hello world');
  console.log(result);
}

//调用使用
asyncFunc()

image-20240904002356070
文章来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zookeeper是啥?在kafka中有什么作用

一、Zookeeper是啥 问AI&#xff0c;它是这么说&#xff1a; ZooKeeper是一个开源的分布式协调服务。 ZooKeeper最初由雅虎研究院开发&#xff0c;用于解决大型分布式系统中的协调问题&#xff0c;特别是为了避免分布式单点故障。它被设计成一个简单易用的接口集&#xff0c;封…

家教管理系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装家教管理系统软件来发挥其高效地信息处理的作用&#xff0c…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 09部署OSPF

本章的目的是帮助网络工程师确定网络的理想 OSPF 配置。本章将回答以下问题 应何时在数据中使用OSPF ?配置 OSPF 的关键设计原则是什么?OSPFv2 和 OSPFv3 之间有什么区别&#xff0c;应如何使用?如何在路由协议栈中配置 OSPF ?如何在服务器上配置 OSPF&#xff0c;例如为容…

【Python机器学习】词向量推理——词向量

目录 面向向量的推理 使用词向量的更多原因 如何计算Word2vec表示 skip-gram方法 什么是softmax 神经网络如何学习向量表示 用线性代数检索词向量 连续词袋方法 skip-gram和CBOW&#xff1a;什么时候用哪种方法 word2vec计算技巧 高频2-gram 高频词条降采样 负采样…

SpringMvc--后续(参数问题)

参数问题 package com.hwq.controller;import com.hwq.beans.User; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframewo…

vllm源码解析(一):整体架构与推理代码

vlllm官方代码更新频发,每个版本都有极大变动, 很难说哪个版本好用. 第一次阅读vllm源码是0.4.0版本,对这版圈复杂度极高的调度代码印象深刻 0.4.1对调度逻辑进行重构,完全大变样, 读代码速度快赶不上迭代的速度了。 现在已经更新到0.5.4, 经过长时间观察&#xff0c;发现主要的…

认知杂谈34

今天分享 有人说的一段争议性的话 I 环境的影响 I 首先得说说&#xff0c;环境这东西对人的影响真不是盖的。你要是老待在一个死气沉沉的地方&#xff0c;那你的激情和梦想&#xff0c;可能慢慢就会被磨得平平无奇。 I 激情的消逝 I 本来你可能是满怀激情&#xff0c;想要大干一…

HMI触屏网关-VISION如何与Node-red通信

上文&#xff1a;HMI触屏网关-VISION如何与Modbus TCP从机通信-CSDN博客 1. Node-red启用HTTP监听 HTTP监听&#xff0c;用于模拟WebAPI服务端&#xff0c;接收WebAPI客户端GET请求。 启用HTTP监听服务&#xff0c;选择请求方式GET&#xff1b;URL自定义&#xff0c;本示例设…

人活着的意义是什么

大家好&#xff0c;我是凡人。 最近很多行业已经受到了 AI 带来的冲击&#xff0c;造成现在网络上一些消极情绪滋生。 这篇文章来源于我回答了一个知乎小哥的问题后&#xff0c;有了点思考&#xff0c;他的问题是这样的“可能我们普通人一辈子都无法为人类社会做出大的贡献&a…

自动化测试概念(1)

常⻅⾯试题 1.⾃动化测试能够取代⼈⼯测试吗&#xff1f; ⾃动化测试不⼀定⽐⼈⼯测试更能保障系统的可靠性&#xff0c;⾃动化测试是测试⼈员⼿⼯编写&#xff0c; 后续如果有功能的变更⾃动化也需要进⾏不定期的维护和更新。 2.⾃动化测试可以⼤幅度降低⼯作量&#xff1…

腾讯40岁老哥毕业了

我的朋友岳京杭发了篇文章&#xff0c;谈到了一位腾讯站up主「老龚40了啥也不是」 近期离职腾讯的故事。 2019年年底&#xff0c;36岁的老龚跳槽去了深圳腾讯&#xff0c;北漂变深漂。老龚合租在腾讯公司附近&#xff0c;月租2000&#xff0c;老婆孩子依然在长沙&#xff0c;老…

远程桌面 Rust Desk 自建服务器

因为某些原因(诈骗)&#xff0c;Rush Desk 服务已暂停国内访问&#xff0c;今天我们介绍如何利用自己的服务器搭建 Rust Desk 远程桌面&#xff0c;低延迟电脑远程手机&#xff0c;手机远程电脑等 一、准备工作 准备一台服务器&#xff0c;我用的腾讯云服务器&#xff0c;一年…

全国地市未来产业水平数据集(2008-2023年)

未来产业&#xff0c;作为驱动经济社会高质量发展的核心引擎&#xff0c;是指依托科技创新和模式创新&#xff0c;引领全球新一轮科技革命和产业变革&#xff0c;具有前瞻性、先导性、战略性的新兴产业领域。也是实现生产力大解放&#xff0c;推动生产力质的跃迁并形成新质生产…

2024华为OD机试真题-反射计数Python-C卷D卷-200分

2024华为OD机试最新E卷题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 题目解析 代码 题目描述 给定一个包含 0 和 1 的二维矩阵。 给定一个初始位置和速度,一个物体从给定的初始位置出发,在给定的速度下进行移动,遇到矩阵的边缘则…

机器学习实战篇——肿瘤良性/恶性分类器(二元逻辑回归)

机器学习之实战篇——肿瘤良性/恶性分类器&#xff08;二元逻辑回归&#xff09; 前言数据集和实验文件下载相关文章推荐实验过程导入相关模块数据预处理手写二元逻辑回归模型&#xff08;小批量梯度下降&#xff09;sklearn逻辑回归器 前言 实验中难免有许多缺陷和错误&#…

20240903软考架构-------软考111-115答案解析

每日打卡题111-115答案 111、【2016年真题】 难度&#xff1a;一般 实时操作系统&#xff08;RTOS&#xff09;内核与应用程序之间的接口称为&#xff08; &#xff09;。 A&#xff0e;I&#xff0f;O接口 B&#xff0e;PCI C&#xff0e;API D&#xff0e;GUI 答案&#xff…

HTML音乐圣诞树

目录 写在前面 完整代码 下载代码 代码分析 系列文章 写在最后 写在前面 圣诞节(Christmas)亦称耶稣圣诞节、主降生节,天主教亦称耶稣圣诞瞻礼。译名为“基督弥撒”,它源自古罗马人迎接新年的农神节,与基督教本无关系。在基督教盛行罗马帝国后,教廷随波逐流地将这…

【Java那些事】关于Git的使用

目录 下拉代码仓库篇 上传代码篇 下拉代码仓库篇 第一步&#xff0c;下拉代码&#xff0c;复制链接。 &#xff08;从开源网站上复制链接&#xff09; &#xff08;建立本地仓库&#xff09; 这里的URL一般都会自动填充刚刚复制的链接【瞅瞅&#xff0c;确保是想要的那个项…

【pycharm-乱码】简单记录一下都有哪些涉及编码

控制台 路径&#xff1a;setting-》general-》console setting-》editor-》file encodings 路径&#xff1a;setting-》editor->file and code templates #!/user/bin/env python3 # -*- coding: utf-8 -*-setting->tools->ssh terminal

QT入门-安装

文章目录 起步安装QT在线安装安装过程配置环境变量更新或删除Qt 平台需求 界面简介绍创建第一个项目 起步 安装QT 您可以使用在线或离线安装程序安装Qt框架和工具&#xff0c;或者自己构建源包。 安装程序允许您下载并安装以下组件: Qt库&#xff0c;为特定的开发平台(操作…