什么是异步编程

什么是异步编程,异步编程简单来说就是:执行一个指令不会马上返回结果而执行下一个任务,而是等到特定的事件触发后,才能得到结果。

异步编程时就需要指定异步任务完成后需要执行的指令,总的来说有以下几种“指定异步指令”的方式:

  1. 属性
  2. 回调
  3. Promise
  4. Generator
  5. await,async

属性

早期的javascript的异步的实现也类似于这种类的属性的方式:每个类实例的相关回调事件有相应的handler(onclick,onchange,onload) 等。

在DOM0级事件处理程序,就是将一个函数赋值给一个元素的属性。

element.onclick=function(){console.log("clicked");
}
window.onload=function(){console.log("loaded");
}
复制代码

回调(发布/订阅)

由于javascript支持函数式编程,JavaSCript语言对异步编程的实现可以用回调函数。 DOM2级事件解决了这个问题以上两个问题

element.addEventListener("click",function(){console.log("clicked");
});
复制代码

Promise

Promise很好的解决了"并行"的问题,我们看看用promise库怎么发送get请求:

import fetch from 'node-fetch';
fetch('https://api.github.com')
.then((res)=>res.json())
.then((json)=>console.log("json:",json))
复制代码

可以看到promise把原来嵌套的回调,改为级连的方式了,实际是一种代理(proxy)。

新建一个promise实例:

let promise = new Promise((resolve, reject)=>{// 异步操作的代码if(/* 异步操作成功 */){resolve(value);} else {reject(error);}
});
复制代码

promise把成功和失败分别代理到resolved 和 rejected . 同时还可以级连catch异常。

Generator

简单来说generator可以理解为一个可遍历的状态机。

语法上generator,有两个特征:

  1. function关键字与函数名之前有一个星号。
  2. 函数体内部使用 yield关键字,定义不同的内部状态。

由于generator是一个状态机,所以需要手动调用 next才能执行,但TJ大神开发了co模块,可以自动执行generator。

import co from 'co';
co(function* (){let now = Date.now();yield sleep(150); // 约等待150msconsole.log(Date.now() - now);
});function sleep(ms){return function(cb){setTimeout(cb, ms);};
}
import fetch from 'node-fetch';co(function* (){let result = yield [(yield fetch('https://api.github.com/users/1')).json(),(yield fetch('https://api.github.com/users/2')).json(),];console.log("result:",result);
});
复制代码

无论是延迟执行,还是并发的从两个接口获取数据,generator都可以用同步的方式编写异步代码。

await,async(ECMAScript7)

ES7 引入了像C#语言中的 await,async关键字,而且babel已支持(引入plugins:transform-async-to-generator )

async函数完全可以看作多个异步操作,包装成的一个Promise对象,而await命令就是内部then命令的语法糖。

import fetch from 'node-fetch';
(async function (){let result= await fetch('https://api.github.com/users/etoah');let json =await result.json();console.log("result:",json);
})();//exception
(async function (){try{let result= await fetch('https://api.3github.com/users/etoah');let json =await result.json();console.log("result:",json);}catch(ex){console.warn("warn:",ex);}
})()
复制代码

简单比较会发现,async函数就是将Generator函数的星号(*)替换成async,将yield替换成await,同时不需要co模块,更加语义化。

但是与yeild又不完全相同,标准没有接收await*的语法( :( 查看详情),

若需“并行”执行promise数组,推荐用Promise.All,所以需要并行请求时,需要这样写:

(async function (){let result= await Promise.all([(await fetch('https://api.github.com/users/tj')).json(),(await fetch('https://api.github.com/users/etoah')).json()]);console.log("result:",result);
})();
复制代码

总结

到这里,jser结合promise,yield,await的写法,可以和回调嵌套说拜拜了。

JavaScript异步史相关推荐

  1. JavaScript 异步编程--Generator函数、async、await

    JavaScript 异步编程–Generator函数 Generator(生成器)是ES6标准引入的新的数据类型,其最大的特点就是可以交出函数的执行的控制权,即:通过yield关键字标明需要暂停的语 ...

  2. JavaScript异步调用的发展历程

    同步与异步 通常,代码是由上而下依次执行的.如果有多个任务,就必须排队,前一个任务完成,后一个任务才能执行.这种连续的执行模式就叫做同步. a(); b(); c(); 复制代码 上面代码中,a.b. ...

  3. JQuery日记6.5 Javascript异步模式(一)

    理解力JQuery前实现异步队列,有必要理解javascript异步模式. Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行. 在多线程的语言中最 ...

  4. JavaScript异步精讲,让你更加明白Js的执行流程!

    JavaScript异步精讲,让你更加明白Js的执行流程! 问题点 什么是单线程,和异步有什么关系 什么是 event-loop jQuery的Deferred Promise 的基本使用和原理 as ...

  5. 前端知识点回顾之重点篇——JavaScript异步机制

    JavaScript异步机制 来源:https://www.cnblogs.com/zhaodongyu/p/3922961.html JavaScript是单线程异步执行的,单线程意味着代码在任务队 ...

  6. 细说JavaScript异步函数发展历程

    2019独角兽企业重金招聘Python工程师标准>>> < The Evolution of Asynchronous JavaScript >外文梳理了JavaScri ...

  7. 写给初学者的JavaScript异步编程和背后思想

    导读: 对于接触JavaScript这门编程语言没有多久的本菜鸡而言,在相当长的一段时间内,我都完全无法理解这门语言中的异步编程,不明白什么叫异步编程以及为什么需要异步编程.为什么顺序执行程序就不行了 ...

  8. 短小强悍的JavaScript异步调用库

    原文链接:  7 lines JavaScript library for calling asynchronous functions  翻译人员: 铁锚 翻译时间: 2014年02月18日 示例地 ...

  9. Javascript异步编程之一异步原理

    本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...

最新文章

  1. 简洁好用的KDTree模板
  2. 怎么把页面内容填满一页_Excel表格太宽,一张纸打印不下,两张纸又空太多!怎么办?...
  3. python中文叫什么意思-python中文读什么
  4. 操作笔记:tomcat在正式环境的常见问题和idea的远程调试
  5. rpm 软件的安装和卸载
  6. UICollectionView的sectionHeader悬浮效果
  7. Android中Application类用法
  8. iview中时间选择器可设置选择范围方法(一个月 一周等)
  9. win7系统锁定计算机设置方法
  10. AspxTreeList获取选中项的值
  11. Flex读取非UTF-8中文数据乱码问题的解决方案
  12. ffmpeg 推流命令记载
  13. CruiseControl 安装配置
  14. 内地见证可以办理哪些香港银行卡?哪家更方便门槛要求更低?
  15. ubuntu系统给u盘拷贝文件
  16. 2021宿州市地区高考成绩排名查询,2021年宿州所有小学名单及排名,宿州最好的小学有哪些...
  17. 苹果手机怎么在照片上添加文字_用手机修图软件,给照片添加精美的文字排版,如何操作最简单?...
  18. 华为设备配置IS-IS的负载分担
  19. python统计中文字数_用 Python 统计字数
  20. i9 10900K比9900K性能提升了多少?i9-10900K和i9-9900K区别对比评测 更多详情咨询世通兰陵王

热门文章

  1. 微软获 OpenAI 独家 GPT-3 模型授权,是潘多拉还是聚宝盆?
  2. 别和 Python 说再见了!!
  3. 春运渡劫?Python帮你12306抢回家的火车票
  4. 算法导论读书笔记-第十九章-斐波那契堆
  5. Java web 强制301跳转
  6. 6条可以成为更好程序员的建议
  7. Spring Cloud Edgware新特性之一:解决Eureka中Jersey 1.x版本过旧的问题-不使用Jersey
  8. IOS反汇编工具Hopper分析Crash Log
  9. Goods:注册页面保存User功能发送邮件以及激活功实现
  10. Can't load IA 32-bit .dll on a AMD 64-bit platform