热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

总结异步编程的六种体式格局

异步编程尽人皆知JavaScript是单线程事情,也就是只要一个剧本实行完成后才实行下一个剧本,两个剧本不能同时实行,假如某个剧本耗时很长,背面的剧本都必须列队等着,会迁延全部递次
异步编程

尽人皆知 Javascript 是单线程事情,也就是只要一个剧本实行完成后才实行下一个剧本,两个剧本不能同时实行,假如某个剧本耗时很长,背面的剧本都必须列队等着,会迁延全部递次的实行。以下为几种异步编程体式格局的总结,愿望与君共勉。

  • 回调函数
  • 事宜监听
  • 宣布定阅形式
  • Promise
  • Generator (ES6)
  • async (ES7)

异步编程传统的解决方案:回调函数事宜监听

初始示例:假设有两个函数, f1 和 f2,f1 是一个须要肯定时刻的函数。

function f1() {
setTimeout(function(){
console.log('先实行 f1')
},1000)
}
function f2() {
console.log('再实行 f2')
}

回调函数

由于 f1 是一个须要肯定时刻的函数,所以能够将 f2 写成 f1 的回调函数,将同步操纵变成异步操纵,f1 不会壅塞递次的运转,f2 也无需空空守候,比方 JQuery 的 ajax。

回调函数的demo:

function f1(f2){
setTimeout(function(){
console.log('先实行 f1')
},1000)
f2()
}
function f2() {
console.log('再实行 f2')
}

效果以下:
《总结异步编程的六种体式格局》

总结:回调函数易于完成、便于明白,然则多次回调会致使代码高度耦合

事宜监听

剧本的实行不取决代码的递次,而取决于某一个事宜是不是发作。

事宜监听的demo

$(document).ready(function(){
console.log('DOM 已 ready')
});

宣布定阅形式

宣布/定阅形式是应用一个音讯中间,宣布者宣布一个音讯给音讯中间,定阅者从音讯中间定阅该音讯,。类似于 vue 的父子组件之间的传值。

宣布定阅形式的 demo

//定阅done事宜
$('#app').on('done',function(data){
console.log(data)
})
//宣布事宜
$('#app').trigger('done,'haha')

Promise

Promise 现实就是一个对象, 从它能够获得异步操纵的音讯,Promise 对象有三种状况,pending(进行中)、fulfilled(已胜利)和rejected(已失利)。Promise 的状况一旦转变以后,就不会在发作任何变化,将回调函数变成了链式挪用。

Promise 封装异步要求demo

export default function getMethods (url){
return new Promise(function(resolve, reject){
axios.get(url).then(res => {
resolve(res)
}).catch(err =>{
reject(err)
})
})
}
getMethods('/api/xxx').then(res => {
console.log(res)
}, err => {
console.log(err)
})

Generator

Generator 函数是一个状况机,封装了多个内部状况。实行 Generator 函数会返回一个遍历器对象,运用该对象的 next() 要领,能够遍历 Generator 函数内部的每个状况,直到 return 语句。

形式上,Generator 函数是一个一般函数,然则有两个特性。一是,function关键字与函数名之间有一个星号;二是,函数体内部运用yield表达式, yield是停息实行的标记。

next() 要领碰到yield表达式,就停息实行背面的操纵,并将紧跟在yield背面的谁人表达式的值,作为返回的对象的value属性值。

Generator 的 demo

function *generatorDemo() {
yield 'hello';
yield 1 + 2;
return 'ok';
}
var demo = generatorDemo()
demo.next() // { value: 'hello', done: false }
demo.next() // { value: 3, done: false }
demo.next() // { value: 'ok', done: ture }
demo.next() // { value: undefined, done: ture }

async

async函数返回的是一个 Promise 对象,能够运用 then 要领添加回调函数,async 函数内部 return 语句返回的值,会成为 then 要领回调函数的参数。当函数实行的时刻,一旦碰到await就会先返回,比及异步操纵完成,再接着实行函数体内背面的语句。

1.await敕令背面返回的是 Promise 对象,运转效果多是rejected,所以最好把await敕令放在try…catch代码块中。

async 的 demo1

async function demo() {
try {
await new Promise(function (resolve, reject) {
// something
});
} catch (err) {
console.log(err);
}
}
demo().then(data => {
console.log(data) //
})

参考文献
https://developers.google.com…
http://es6.ruanyifeng.com/


推荐阅读
  • 一、路由首先需要配置路由,就是点击good组件进入goodDetail组件配置路由如下{path:goodDetail,component:goodDetail}同时在good组件中写入如下点击事件,路由中加入 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Vue3中setup函数的参数props和context配置详解
    本文详细介绍了Vue3中setup函数的参数props和context的配置方法,包括props的接收和配置声明,以及未通过props进行接收配置时的输出值。同时还介绍了父组件传递给子组件的值和模板的相关内容。阅读本文后,读者将对Vue3中setup函数的参数props和context的配置有更深入的理解。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • 本文介绍了在Go语言中可见性与scope的规则,包括在函数内外声明的可见性、命名规范和命名风格,以及变量声明和短变量声明的语法。同时,还介绍了变量的生命周期,包括包级别变量和局部变量的生命周期,以及变量在堆和栈上分配的规则和逃逸分析的概念。 ... [详细]
author-avatar
沛妤林_654
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有