摘要:以下为几种异步编程方式的总结,希望与君共勉。回调函数事件监听发布订阅模式异步编程传统的解决方案回调函数和事件监听初始示例假设有两个函数和,是一个需要一定时间的函数。
异步编程
众所周知 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/
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/109516.html
摘要:组合继承也是需要修复构造函数指向的这种方式融合原型链继承和构造函数的优点,是中最常用的继承模式。的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到上面所以必须先调用方法,然后再用子类的构造函数修改。 前言 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。 大部分面向对象的编程语言,...
摘要:组合继承也是需要修复构造函数指向的这种方式融合原型链继承和构造函数的优点,是中最常用的继承模式。的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到上面所以必须先调用方法,然后再用子类的构造函数修改。 前言 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。 大部分面向对象的编程语言,...
摘要:组合继承也是需要修复构造函数指向的这种方式融合原型链继承和构造函数的优点,是中最常用的继承模式。的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到上面所以必须先调用方法,然后再用子类的构造函数修改。 前言 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。 大部分面向对象的编程语言,...
摘要:组合继承也是需要修复构造函数指向的这种方式融合原型链继承和构造函数的优点,是中最常用的继承模式。的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到上面所以必须先调用方法,然后再用子类的构造函数修改。 前言 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。 大部分面向对象的编程语言,...
这是 最近在学习js继承时看了多篇文章以及自我总结的学习笔记。 目录:一:原型链二:构造函数三:原型链和构造函数组合继承四:原型式五:寄生式六:寄生组合式 1、原型链 function Super(){ this.name = lily; this.age = 21; this.arr = [1,2,3] } function Sub(){} Sub.prototype = new S...
阅读 3475·2021-11-24 09:39
阅读 756·2019-08-30 14:22
阅读 3014·2019-08-30 13:13
阅读 2285·2019-08-29 17:06
阅读 2870·2019-08-29 16:22
阅读 1238·2019-08-29 10:58
阅读 2382·2019-08-26 13:47
阅读 1568·2019-08-26 11:39