前端学习-同步异步问题

article/2025/8/28 10:40:04

在做实作课作品时,出现过对象中变量访问不到的情况,查阅相关资料发现时同步异步的问题,这篇文章帮助我理清思路,希望也能帮助你们更好地理解同步异步。

一、什么是同步/异步任务?

  • 同步任务:指的是在主线程上排队执行的任务,只有当前一个任务执行完毕后才可执行下一个任务。(keyword:按顺序,自上而下)
  • 异步任务:指的是不进入主线程,而进入任务队列的任务。只有当任务队列通知主线程某个异步任务可以执行,方可进入主线程进行执行。(keyword:通知主线程后方可执行)

二、为什么会出现异步问题?

  • 由于JavaScript是一门单线程语言,即同一时间只能做一件事;
  • JS本身是同步执行;
  • 但在执行耗时操作时为了避免阻塞后续代码的执行,通常采用异步操作;
  • 通过事件循环(event loop)实现异步。

异步操作会导致:如果下一个函数需要未执行完成的当前函数中的元素,由于当前函数未对该元素进行处理,而异步使得下一个函数先执行,自然导致下一个函数中获取的该元素为空。辅助代码如下:

<script type="text/javascript">window.onload=function(){A();B();}function A(){setTimeout(function(){window.data=100;console.log("A:",window.data)},3000);}function B(){console.log("B:",window.data);}
</script>

代码执行结果为:

  •  如果不存在异步,即:先执行A(),浏览器等待3s后,对window.data赋值,再输出window.data的值;再执行B()
  • 目前存在异步使得,先执行B(),再执行A()。因为setTimeout中的函数没有立即执行,而是延迟了一段时间,所以可知,A中存在异步任务--》B函数先执行。将A放入任务队列中,等待同步任务和任务队列现有的事件实行完才会执行。

三、常见的异步问题及其解决方法。 

(1)Ajax请求

通过Ajax发送网络请求时由于网络延迟,会导致异步问题产生。解决方法如下:

  • asynchronous=>异步,故取值为true时,该请求异步执行,false时同步执行。
$.ajax({//获取用户收藏列表url: xxxxx//请求的端口dataType: "json",async : false,//false代表同步执行,true代表异步执行type: "POST",success: function(result) {if (result.status == 200) {//请求成功的操作} else {//后端接口返回失败的操作}},fail: function() {//请求失败的操作}error: function() {//请求发生错误的操作}});
  • 写函数时理清逻辑顺序,请求成功后,再调用后续函数。弊端:会造成层层嵌套
$.ajax({//获取用户收藏列表url: xxxxx//请求的端口dataType: "json",type: "POST",success: function(result) {if (result.status == 200) {//请求成功的操作A();//请求成功后再执行操作B();} else {//后端接口返回失败的操作}},fail: function() {//请求失败的操作}error: function() {//请求发生错误的操作}});

(2)Axios

基于promise的HTTP轻量级库,可以不需要引入Jquery.js

async f() {var result={};var param = ####var url = ####await axios.post(url, param).then(function (res) {if (res.status == 200) {result=res.data.data;//根据接口返回的数据进行赋值} else {alert("获取失败!");}});},

async、await:Promise的语法糖;此处使用async是为了令f()声明为异步函数,await用于等待异步结果。语法上规定await只能出现在async中。通过二者搭配,使得该函数运行完成后才可运行其它函数,即实现同步

(3)Promise优化异步

补充知识:Promise对象用于表示一个异步操作的最终完成(或失败)及其结果的返回值

利用Promise可以避免层层嵌套的回调函数

function A(){return "成功111";
}
var myFirstPromise = new Promise(function(resolve, reject){//当异步代码执行成功时调用resolve(...), 当异步执行代码失败时调用reject(...)//此处使用setTimeout(...)模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.setTimeout(function(){resolve(A()); //代码成功执行}, 250);
});myFirstPromise.then(function(successMessage){//successMessage的值是上面调用resolve(...)方法传入的值.//successMessage参数不一定非要是字符串类型,这里只是举个例子document.write(successMessage);document.write("Yay! ");
});

由于Promise.prototype.then方法返回的是一个新的Promise对象,因此可采用链式写法,按顺序依次调用。

getJSON("/posts.json").then(function(json) {return json.post;
}).then(function(post) {// proceed
});

第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。

如果前一个回调函数返回的是Promise对象,这时后一个回调函数就会等待该Promise对象有了运行结果,才会进一步调用。(横向发展改为向下发展)


本篇文章是在多篇文章的理解下结合本人的理解完成的,如有不正确的地方欢迎指出~

参考文档: 

[1] https://blog.csdn.net/jiaweiok123/article/details/87930753

[2] https://blog.csdn.net/weixin_41809916/article/details/79829897

[3] https://juejin.cn/post/6844903810263941134 

[4]https://www.runoob.com/w3cnote/javascript-promise-object.html


http://chatgpt.dhexx.cn/article/BaHemCEe.shtml

相关文章

dubbo同步异步调用

通常我们通过dubbo调用服务接口&#xff0c;等待提供方处理完响应结果&#xff0c;这是同步调用&#xff1b;也是默认的调用方式。通过查看原吗DubboInvoker可以看到&#xff1a; 整体来说有三种方式&#xff1a; 1、是否关注结果&#xff0c;returntrue关注&#xff0c;默认也…

理解:什么是同步和异步?什么是阻塞和非阻塞?

一、同步和异步 同步与异步是指访问数据的机制&#xff0c;同步一般指主动请求并等待IO操作完成的方式。 异步则指主动请求数据后便可以继续处理其它任务&#xff0c;随后等待IO操作完毕的通知。 同步和异步最大的区别就在于&#xff1a;同步需要等待&#xff0c;异步不需要等…

CPUGPU加速计算

1、CPU(Centrol Processing Unit) CPU上的大部分面积做了cache 和控制逻辑&#xff0c;天然适合做复杂串行程序&#xff1b; 2、GPU(Graphic Processing Unit): GPU有更多的晶体管用于数据处理&#xff0c;特别适用于解决并行计算的问题。可以使程序执行速度加快。为处理图形…

tensorflow使用GPU加速

测试faster-rcnn时&#xff0c;cpu计算速度较慢&#xff0c;调整代码改为gpu加速运算 将 with tf.Session() as sess: 替换为 1 gpu_options tf.GPUOptions(per_process_gpu_memory_fraction0.9) 2 with tf.Session(configtf.ConfigProto(gpu_optionsgpu_options,log_device_…

GPU 及其加速库简介

文章目录 一、GPU 与 CPU 简介1、GPU 与 CPU 的区别2、GPU 分类3、GPU&#xff08;NVIDIA A100 &#xff09; 介绍 二、CUDA 简介1、多版本 CUDA 切换2、为各种 NVIDIA 架构匹配 CUDA arch 和 gencode 三、OpenCL 简介1、OpenCL 平台模型2、OpenCL 执行模型 四、参考资料 一、G…

Pytorch使用GPU加速的步骤

CUDA&#xff08;Compute Unified Device Architecture&#xff09;&#xff0c;是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU能够解决复杂的计算问题。近些年来&#xff0c;显卡的计算能力越来越强大&#xff0c;如果只…

Python程序如何用GPU加速:Tesla、CUDA、Numba

概念解析 首先要明白&#xff0c;普通的Python代码是无法使用GPU加速的&#xff0c;只能在GPU上跑针对GPU设计的程序。 硬件加速必须要用硬件语言实现。 查询PythonGPU关键字&#xff0c;除了TensorFlow&#xff0c;另外出镜率比较高的几个概念是&#xff1a;Numba、CUDA、PyCU…

什么是 GPU 加速的计算?

什么是 GPU 加速的计算? GPU 加速计算是指同时采用图形处理单元 (GPU) 和 CPU&#xff0c;以加快科学、分析、设计、消费者和企业应用程序的速度。GPU 加速器于 2007 年由 NVIDIA 率先推出&#xff0c;现已在世界各地为政府实验室、大学、公司以及中小型企业的高能效数据中心提…

MATLAB上的GPU加速计算

概述 怎样在MATLAB上做GPU计算呢?主要分为三个步骤&#xff1a;数据的初始化、对GPU数据进行操作、把GPU上的数据回传给CPU 一、数据的初始化 首先要进行数据的初始化。有两种方法可以进行初始化&#xff1a;一是先在CPU上设置好数据然后拷贝到GPU&#xff1b;二是直接在GPU…

常用的python gpu加速方法

在使用 PyCharm进行机器学习的时候&#xff0c;我们常常需要自己创建一些函数&#xff0c;这个过程中可能会浪费一些时间&#xff0c;在这里&#xff0c;我们为大家整理了一些常用的 Python加速方法&#xff0c;希望能给大家带来帮助。 在 Python中&#xff0c;我们经常需要创建…

Matlab 应用GPU加速

由于GPU近几年地迅速发展&#xff0c;GPU在多线程计算等方面逐渐超越CPU成为计算的主力军。而Matlab是常用的数学应用软件&#xff0c;现在讲解一下如何在Matlab中使用GPU加速计算 文章目录 0. 必要条件1.给GPU传输数据1.1 CPU的数据复制到GPU1.2 直接在GPU上设置数据&#xf…

tensorflow的GPU加速计算

参考 tensorflow的GPU加速计算 - 云社区 - 腾讯云 一、概述 tensorflow程序可以通过tf.device函数来指定运行每一个操作的设备&#xff0c;这个设备可以是本地的CPU或者GPU&#xff0c;也可以是某一台远程的服务器。tensorflow会给每一个可用的设备一个名称&#xff0c;tf.…

Pytorch使用GPU加速

1. 可以在cmd窗口输入nvidia-smi命令来确认自己的显卡是否有CUDA。 没有的话&#xff0c;需要安装。&#xff08;搜CUDA官网按照步骤来&#xff09; 2. 然后安装pythorch。 必须安装的有torch和torchvision两个包&#xff0c; &#xff01;注意不要直接在Pycharm中自动下…

一文读懂:GPU加速是什么?

众所周知&#xff0c;网页不仅应该被快速加载&#xff0c;同时还应该流畅运行&#xff0c;比如快速响应的交互&#xff0c;如丝般顺滑的动画…… 一. GPU加速能做什么&#xff1f; 首先我们要了解什么是16ms优化 大多数设备的刷新频率是60次/秒&#xff0c;&#xff08;1000…

MATLAB使用GPU加速计算

先上结论 1、对于特征值运算eig()函数来说&#xff0c;GPU的加速效果是很明显的 2、如果要求精度不高&#xff0c;采用单精度计算&#xff0c;加速效果更加明显 首先查看自己的电脑是不是支持GPU计算 在matlab的终端中输入&#xff1a; gpuDevice()可以看出我电脑的显卡为N…

了解GPU加速计算

1、什么是GPU加速计算 GPU&#xff0c;又称显示核心、视觉处理器、显示芯片&#xff0c;是一种专门在个人电脑、工作站、游戏机和一些移动设备&#xff08;如平板电脑、智能手机等&#xff09;上图像运算工作的微处理器&#xff0c;与CPU类似&#xff0c;只不过GPU是专为执行复…

Python GPU加速

Numba:高性能计算的高生产率 在这篇文章中&#xff0c;笔者将向你介绍一个来自Anaconda的Python编译器Numba&#xff0c;它可以在CUDA-capable GPU或多核cpu上编译Python代码。Python通常不是一种编译语言&#xff0c;你可能想知道为什么要使用Python编译器。答案当然是&#x…

关于TensorFlow使用GPU加速

我们在安装tensorflow-gpu后&#xff0c;其运行时我们可以选定使用gpu来进行加速训练&#xff0c;这无疑会帮助我们加快训练脚步。 &#xff08;注意&#xff1a;当我们的tensorflow-gpu安装后&#xff0c;其默认会使用gpu来训练) 之前博主已经为自己的python环境安装了tensorf…

GPU加速原理

原文&#xff1a;https://blog.csdn.net/weiweigfkd/article/details/23051255 GPU加速技术&原理介绍 1、GPU&CPU GPU英文全称Graphic Processing Unit&#xff0c;中文翻译为“图形处理器”。与CPU不同&#xff0c;GPU是专门为处理图形任务而产生的芯片。从这个任务定…

让GPU跑的更快

作为一个cuda爱好者 一定要好好看看 不再让CPU和总线拖后腿&#xff1a;Exafunction让GPU跑的更快&#xff01;确实只用cpu会卡的一比... 在云服务中使用 GPU 是获得低延迟深度学习推理服务最经济的方式。使用 GPU 的主要瓶颈之一是通过 PCIe 总线在 CPU 和 GPU 内存之间复制…