JavaScript 回调函数/Promise/ async/await

并发和并行

并行和并发是两个概念,容易混淆是因为并行和并发在中文意思上相近,其实在英文中,这是完全不相同的东西,并行(parallelism)、并发(concurrency)。

并行(parallelism):是微观概念,假设CPU有两个核心,则我们就可以同时完成任务A和任务B,同时完成多个任务的情况就可以称之为并行。

并发(concurrency):是宏观概念,现在有任务A和任务B,在一段时间内,通过任务之间的切换完成这两个任务,这种情况称之为并发。

回调函数

回调函数广泛存在于我们所编写的JavaScript代码中,它表现在事件绑定,Ajax请求或者其他的情况下,一个回调函数可表现成如下形式

ajax(url, () => { console.log(‘这里是回调函数’);})

回调地狱: 回调函数很好的解决了某些异步情况,但过度滥用回调函数会造成回调地狱,即回调函数过长,嵌套过深。过长或者嵌套过深的回调函数,会让回调函数存在强耦合关系,一旦有一个函数有所改动,那么可能会牵一发而动全身。一个回调地狱可能如下所示:

ajax(firstUrl, () => { console.log(‘这里是首次回调函数’); ajax(secondUrl, () => { console.log(‘这里是第二次回调函数’); ajax(threeUrl, () => { console.log(‘这里是第三次回调函数’); // todo更多 }) })})

Generator

在ES6之前,一个函数一旦执行将不会被中断,一直到函数执行完毕,在ES6之后,由于Generator的存在,函数可以暂停自身,待到合适的机会再次执行。用Generator可以解决回调地狱。

function *fetch() { yield ajax(url, () => {console.log(‘这里是首次回调函数’);}); yield ajax(url, () => {console.log(‘这里是第二次回调函数’);}); yield ajax(url, () => {console.log(‘这里是第三次回调函数’);});}var it = fetch();var result1 = it.next();var result2 = it.next();var result3 = it.next();

Promise

Promise翻译过来就是承诺的意思,Promise一共有三种状态:pending(等待中)、resolve(完成)和reject(拒绝),这个承诺意味着在将来一定会有一个表决,并且只能表决一次,表决的状态一定是resolve(完成)或者reject(拒绝),一个Promise可能会是如下的形式:

// 普通的Promisefunction foo() { return new Promise((resolve,reject) => { // 第一次表决有效,其后无论是resolve()还是reject()都无效 resolve(true); resolve(false); })}// Promise解决回调地狱ajax(url).then(res => { console.log(‘这里是首次回调函数’);}).then(res => { console.log(‘这里是第二次回调函数’);}).then(res => { console.log(‘这里是第三次回调函数’);})

async/await

如果一个方法前面加上了async,那么这个方法就会返回一个Promise,async就是将函数用Promise.resolve()包裹了下,并且await只能配合async使用,不能单独出现。一个async/await可能会是如下的形式:

// 普通的async/awaitasync function foo() { let number = await 3; // await自动用promise.resolve()包装 console.log(number);}foo();// async/await解决回调地狱async function fetch() { var result1 = await ajax(url1); var result2 = await ajax(url2); var result3 = await ajax(url3);}fetch();

如若转载,请注明出处:开源字节 https://sourcebyte.cn/article/170.html

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年6月29日 11:33
下一篇 2022年6月29日 11:33

相关推荐

  • 分享4条发微商朋友圈的方法(微商朋友圈应该怎么发)

    对于微商朋友来说,朋友圈的重要性不言而喻了。 那么微商的朋友圈到底该怎么发呢? 为什么同样是经营一个朋友圈,有的微商看起来逼格满满,实际效果也不错;而有的却动都不动就被屏蔽甚至拉黑…

    2022年11月27日
  • TES官宣knight断开连接!网友:左手就是下一个369

    2022LPL冬季转会期已经正式到来,如果说此次转会期热度最高的一支队伍,无疑就是在2022全球总决赛中拿到四强成绩的JDG了。因为据目前网上爆料人的消息来看,JDG很有可能会通过…

    2022年11月27日
  • 存储过程语法(sql server存储过程语法)

    今天小编给各位分享存储过程语法的知识,其中也会对sql server存储过程语法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! oracle存储过程基本语法…

    2022年11月26日
  • 《宝可梦朱紫》梦特性怎么获得?隐藏特性获取方法推荐

    宝可梦朱紫里有很多宝可梦都是拥有梦特性会变强的宝可梦,很多玩家不知道梦特性怎么获得,下面就给大家带来宝可梦朱紫隐藏特性获取方法推荐,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 …

    2022年11月25日
  • 《宝可梦朱紫》奇鲁莉安怎么进化?奇鲁莉安进化方法分享

    宝可梦朱紫中的奇鲁莉安要怎么进化呢?很多玩家都不知道,下面就给大家带来宝可梦朱紫奇鲁莉安进化方法分享,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 奇鲁莉安进化方法分享 奇鲁莉安…

    2022年11月25日
  • 北京疫情为什么突然爆发(北京疫情为什么突然增多)

    这几天北京疫情的新增情况也突然开始变得严重起来了,大家对本轮北京疫情爆发的原因也十分好奇。北京疫情为什么突然爆发?尤其是本周北京疫情的新增开始越来越多了,这让民众对于本轮疫情的发展…

    2022年11月25日
  • 为什么北京疫情越来越严重(疫情为什么越控制越严重)

    有在关注北京疫情的小伙伴应该注意到了,这几天北京疫情的新增数据情况也开始越发的严重起来,大家对北京此次疫情发展情况也都不断分析。为什么北京疫情越来越严重?导致北京本轮疫情的原因是什…

    2022年11月25日
  • iPhoneSE4价格或在3000以内 苹果se4最新消息

    据相关爆料,明年即将在春季发布的iPhoneSE4系列,售价可能会在3000元以内,可能会使用iPhone SE4与红米K系列直接竞争,打算正式进入2000元价位市场。可以看出,如…

    2022年11月24日
  • 成都健康码崩了是怎么回事(成都健康码系统崩了)

    健康码是大家出行必备的工具,有小伙伴反映自己健康码崩了,上不了地铁,那么成都健康码崩了是怎么回事?成都健康码怎么突然崩了?成都健康码崩了是怎么办?下面小编为大家带来成都健康码崩了原…

    2022年11月24日
  • 《宝可梦朱紫》暴飞龙怎么抓?暴飞龙获得方法

    宝可梦朱紫暴飞龙位置在哪?在游戏中,很多玩家还不清楚暴飞龙具体要怎么样获得,其实获得方法很简单,暴飞龙直接是没得抓的,需要玩家从宝贝龙进化得到,下面一起来看一下宝可梦朱紫暴飞龙获得…

    2022年11月23日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息