JavaScript是一种同步,阻止,单线线语言。在这种语言中,一次只能执行一个操作。,用户通过鼠标的交互或获取网络数据)。这意味着代码可以同时执行一些事情,而无需停止或阻止主线程。
传统的异步编程方法基于回调函数,但是由于“回调地狱”的问题,该方法似乎不够优雅。因此,ecmascript 6中添加了Promise参考的类型,以及异步的功能机制,由Async/ Async/ Async/ sync/等待关键字定义,它支持优雅的定义和组织异步逻辑。
在学习与计算机相关的课程时,我们经常遇到同步/异步相关的概念。那么,同步/异步到底是什么?
MDN中异步的定义:
异步是指在不同时间存在或出现两个或多个对象或事件(或出现多个相关的事物不需要等待上一件事的完成)
Wikipedia中异步的定义
因此提供了一定程度的等值。
我在博客中看到异步的定义:
异步描述两个或多个事件/对象之间的关系。这些事件/对象确实在同一系统中相互作用,但不会与预定的间隔发生,也不可能依靠彼此的存在来扮演角色。它们不相互协调,这意味着它们可以同时发生或发生同时,因为他们有自己的独立议程。
通过上述定义,简单的术语是异步与事件/对象无关,并且无需互相依赖来发挥作用。
在计算机技术中,异步通常用于两个主要领域
异步通信是在双方或多个方之间交换消息的一种方式。每个参与者在方便或可操作时收到并处理了该消息,而不是在收到消息后立即处理。此外,此外,消息的消息无需等待有关确认信息。前提是,如果存在问题,接收者将以其他方式纠正或处理情况。
例如:电子邮件是一种异步通信方法;发件人发送邮件,然后接收器在方便时会读取和回复电子邮件,而不是立即进行。双方可以随时继续发送和接收信息,而无需安排双方何时安排安排。
在计算机编程中,异步操作意味着一个过程独立于其他过程,同步操作意味着该过程仅是由于其他过程而进行的。)在上一个(或更多)中(或更多)中的任务无需停止执行即可等待它们完成。
在这方面,我一直都有一个问题,javascript是一个线程,怎么会异,答案是:尽管JavaScript是单个线程,但浏览器是多线程的。具体来说,您可以在事件周期和任务队列中了解JavaScript的知识。
SO称为“异步”只是一个分为两个段的任务,首先执行了第一段,然后转向执行其他任务。准备好后,然后返回执行第二段。
例如,一项任务是读取用于处理的文件。任务的第一段是向操作系统发送请求并需要读取文件。然后,程序执行其他任务,等待直到操作系统返回文件,然后执行任务的第二段(处理文件)这个不连续的执行称为异步。
相应地,连续执行称为同步。由于它是连续执行的,因此无法插入其他任务,因此操作系统只能等待来自硬盘的期限才能读取文件。
异步和同步之间的差异包括:
$ color {red}了解误解$:
个人总是错误地认为同步是同一任务同时是同一任务,并且在所有任务都不同时执行异步。在异步可以同时执行。在计算机编程中,我个人认为同步和异步操作更多地关注任务的执行顺序。例如,图:
$ color {red}并行$:
将共同概念扔到这里的两台计算机中,以防止与同步和异步混淆:
回调函数的多层嵌套。随着调用嵌套的增加,代码级别变得更深,维护难度也增加了。特别是,我们使用可能包含大量周期和有条件语句的真实代码。例如:
嵌套呼叫的“金字塔”将随着异步行为而向右增长。它很快失去了控制。因此,ES6引入了承诺和异步功能。
我说的很早,最后我可以开始学习Promise.LET来看看MDN中的承诺的定义:
承诺对象用于指示异步操作的最终完成(或失败)。
一个对象可以将最终成功返回值或最终操作的原因与相应的处理过程相关联。这样,异步方法可以像同步方法一样返回值:异步方法不会立即返回最终值,但会返回最终值退还承诺将来将其价值授予用户。
必须在以下一个状态之一中:
要确定(承诺)的承诺对象要么通过一个值来实现,要么被一个原因拒绝(错误)。
构造函数主要用于打包不支持承诺的函数(返回值不是)。
语法:
parameters:// recuptfunc称为recupledPromise = new Promise(resolveFunc,recuptfunc)=> {recuptfunc(1);})console.log(recuptedPromise)// Promise {:1}
1.初始待处理状态
2.履行状态
3.拒绝状态
p.then(value => {//满足},原因=> {//拒绝});
//返回承诺对象的承诺对象的状态,让PromisEthen = Promise..then((value)=> {return promise.resolve(1);})console.log(Promisethen); exhield ofered'',[[PromisResult]]:1}
//返回拒绝承诺对象状态的承诺对象。
//返回要确定的承诺对象。
范围:
捕获之间的关系,然后是,如果我们仅在呼叫时处理错误,则可以将NULL用作第一个参数:
在这种情况下,我们也可以直接使用
$ color {red} {note} $:以下代码中的差异
通常用于承诺的执行,无论结果如何,都要进行一些处理或清洁。这也避免了当时()和CAT()中的连续性中相同的代码。
语法
参数:函数在promise中调用。此函数没有参数
返回值console.log(Promistly)// Promise {[[[Promisestate]]:“满足”,[[Promiseresult]]:1}
对于该参数,可以简化3种方法,以简化箭头函数的形式。
回顾前面介绍的知识,我们知道:
公共链调用在以下代码中显示。此方法使代码结构更清晰,比恢复功能表单更容易读取。
让我们看看一个例子:
上面的代码执行过程如下图所示。其中一种方法没有被调用。这是因为在先前的手术中抛出了异常。承诺被拒绝。此时,它将被移交给方法。此外,无论是被接受还是拒绝,该函数将被执行。
如前所述,承诺的构造函数参数被抛出了例外,或者该方法的回调函数的方法被抛弃了异常,并且可以拒绝(被拒绝)的承诺对象。。
因此,在建立诺言或承诺的链条呼吁中,如果发生异常,它们将被捕获并被视为拒绝
例如,代码等效的以下两个部分:
新的Promise(((求解,拒绝)=> {refform('fail');})。然后(null,(quach)=> {console.log(quach); // fail});
对于尚未在Promise中处理的拒绝,JavaScript引擎将跟踪此类拒绝,该拒绝将在这种情况下产生全局错误。例如,以下代码中未准备好的拒绝会引发全局错误。
如果出现未经处理的拒绝,将触发处理程序,并获得具有错误相关信息的事件对象。
此外,这种类型的错误通常无法恢复,因此我们的最佳解决方案是告知用户该问题,事件向服务器报告
未经治疗的事件触发的原因:
当Micro -Task队列中的任务完成后,生成了未经对待的拒绝:引擎将检查承诺。如果承诺中的任何人出现“拒绝”状态,则将触发未经判决的事件。
为了更好和优雅地执行异步处理,Promise本身还提供了一些方便的操作场所。
方法返回具有给定值的承诺对象
语法参数:对象分析的参数也可以是对象,也可以是可启示的。
返回值返回具有给定值的对象。
//承诺对象已完成Promise = new Promise((Resolve,recund)=> {resolve(1);})console.log(Promise.resolve(Promise));//承诺{:1}
//国家状态的承诺对象让Promise =新承诺(Resolve,recund)=> {recult(1);})console.log(promise.resolve(promise));//承诺{:1}
手动实施
方法返回具有拒绝的对象。
语法
参数:拒绝的原因。(通常选择错误实例有助于调试和选择性错误)
出于给定的原因返回被拒绝的对象。没有参数类型,即使传递的参数是可接受的承诺对象,返回的对象也会被拒绝。参数没有相应处理,只有当时的参数将被用作原因拒绝。
手动实施
Promise.All()方法接收到承诺类型迭代类型的输入,并且仅返回一个实例。所有承诺输入的分辨率回调的结果是数组。
语法
参数:一个迭代对象,如果未传输参数,则将抛弃TypeError异常
履行:
//不可思议地完成stateSetimeout(function(){console.log(p); // promise {:array(2)}});
setTimeout(function(){console.log(p); // promise {:44}});
此方法返回了已或遵循所有给出的承诺的承诺,并且具有一个对象数组,每个对象代表相应的承诺结果。
语法
参数:一个迭代对象,每个对象。
返回值settimeout(function(){console.log(p); // promise {}});
setTimeout(function(){console.log(p); // promise {:array(4)});
接收一个迭代对象,只要其中一个是成功的,返回成功的对象。如果迭代对象没有成功,则返回失败的实例和类型。这是一个用于收集单个错误的子类。本质上,此方法相反。
语法参数:迭代对象。
履行:
setTimeout(function(){console.log(p); // promise {:1});
setTimeout(function(){console.log(p); // promise {:gengregateError:所有承诺我们拒绝});
这里的手动实现只是一个一般想法,本机方法之间仍然存在很大的区别。
方法返回承诺。一旦解决或拒绝了迭代器中的承诺,就会解决或拒绝退回的承诺。
语法参数:迭代对象。
只要在给定迭代中的承诺解决方案或拒绝时,返回值以确定的值,将第一个承诺的值用作其值,以便对其进行分析或拒绝它(一旦堆栈为空)。
(p);// Promise {:44}});
Promise.race([P1,P2])。然后(function(value){console.log(value); //“二” //两者,但是p2 faster});;
var p3 = new Promise(函数(解决,拒绝){settimeout(Resolve,100,“三”); var p4 = new Promise(function(Resolve,refffect){Settime,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝;});
Promise.race([P3,P4])。然后(function(value){console.log(value); //“三” // p3速度更快,因此完成},function(quasen){// i被称为});
var p5 = new Promise(函数(解决,拒绝){settimeout(Resolve,500,“五”); var p6 = new Promise(function(Resolve,refffect){settime){settime'(拒绝,拒绝,拒绝,secct,拒绝,拒绝,拒绝,拒绝,教派,拒绝,教派,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,拒绝,sect,sect,sect,sett,sett,sett,sett,sett,set,sett;});
Promise.race([P5,P6])。然后(function(value){//不称为},function(quasen){console.log(quasen); //“六” // p6速度更快,所以它更快,所以它更快,所以它更快,因此它更快,所以它更快,所以它更快,因此更快,因此更快,因此更快,因此更快。});
令P1 = Promise.All([T1,T2]);setTimeout(function(){console.log(p1); // promise {:'reconded!'});
令P2 = Promise.AllSetKy([T1,T2]);setTimeout(function(){console.log(p2); // promise {:array(2)});
令P3 = Promise.any([T1,T2]);setTimeout(function(){console.log(p3); // promise {:'eachield!'});
令P4 = Promise.race([T1,T2]);setTimeout(function(){console.log(p4); // promise {:'eachield!'});
该构造函数用于创建一个新的异步函数对象,而JavaScript中的每个异步函数都是对象。
请注意,它不是全局对象
异步函数是使用关键字的函数。ASYNC关键字可用于功能声明,函数表达式和箭头函数。
异步函数是构造函数的实例,允许使用关键字。LET让我们以更简单的方式写下异步行为,而无需故意链条调用。
语法
返回值//求解的异步函数栏
异步函数的异步函数执行机制的功能主体可以被视为除以0或多个等待表达式。从代码的第一行到(并包括)第一个等待表达式(如果是这样),它同时运行,在此过程中。情况,不包含等待表达式的异步函数将同步运行。但是,如果该函数中有等待的表达式,则异步函数肯定会执行异步。
等待表达后的代码可以视为存在于链条中,然后回调。多个等待的表达式将添加到链回调中。返回值将用作最后一个回调返回值。
例如:
在异步函数中使用尝试/捕获进行错误处理
本文在这里。以上内容是学习过程中个人的一些记录。它们基于官方文件和大兄弟的肩膀。在JavaScript中如何进行优雅的异步处理,将来会继续学习。写作也更加仓促。如果您有任何疑问,我希望大个子能纠正他们。
参考
[1]承诺
[2]异步函数
[3]等待
[4]“ JavaScript高级程序设计(第四版)”
原始:https://juejin.cn/post/7095650217462071309