异步操作和Async函数
时间:2020-05-09
本文章向大家介绍异步操作和Async函数,主要包括异步操作和Async函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Ecmascript-6
ES6 发布时间2015-6月,又称ECMAScript 2015
http://kangax.github.io/compat-table/es6/
基本概念
-
同步:连续的执行;当前任务没完成时,其他任务不能插入执行,只能等待上一个任务执行完成才能开始执行
-
异步:简单说就是将一个任务分为两段,先执行一段,然后转而执行其他任务,等做好了准备之后,再回过来执行第二段
-
回调函数: 吧任务的第二段单独写在一个函数里,等待重新执行这个任务的时候,直接调用这个函数,就是回调; 英文Callbcack
回调出现多重嵌套的时候,会导致代码不是纵向发展而是横向房展,很快代码就栾城 一团,不易管理
代码如下
fs.readFile(fileA, function(err, data){
...
fs.readFile(fileB, function(err, data){
...
fs.readFile(fileC, function(err, data){
...
会出现地狱回调 callback hell
})
});
})
- promise 就是为了解决以上问题而提出的
readFile(fileA).then(function(data){
console.info(11);
}).then(function(){
return readFile(fileB);
}).then(function(data){
console.info();
})....
Generator
协程(coroutine)
多个任务相互协作,完成异步任务
协程遇到yield命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点,就是代码的写法非常想同步操作。
去除掉yield命令,简直就是一模一样
function *asnycJob() {
//...logical code
var f = yield readFile(fileA);
//...logical code
}
Generator函数
最大的特点就是可以交出函数的执行权(即暂停执行)
function* gen(x) {
var y = yield x+2;
return y;
}
var g = gen(2);
console.info(g.next());// {value: 4, done: false}
console.info(g.next()); // {value: undefined, done: true}
Thunk函数
var x = 1;
function add1(y) {
var result = 1+y;
}
add1(x+10);
//传值调用 (10+1)->y=11 ; result = 1+ 11 =12
//传名调用 (x+10)-y; result= 1+ (x+10) -? 1+(1+10) = 12
thunk函数即编译器的‘传名调用’的实现; 往往是将参数放入一个临时函数;再讲函数传入函数体
function add1(y) {
var result = 1+y;
var result2 = 10 + y*1;
}
add1(x+10);
=>
function thunk() {
return x+10;
}
function add1(thunk){
var result = 1+ thunk() ;
var result2 = 10 + thunk() *1;
}
javascript thunk函数转换器
var Thunk = function(fn) {
return function() {
var args = Array.prototype.slice.call(arguments);
return function(callback){
args.push(callback);
return fn.apply(this, args);
}
}
}
var readFileThunk = Thunk( fs.readFile );
readFileThunk(fileA)(callback);
Thunkify模块
生产环境的转换器,建议使用Thunkify模块
使用方式如下
var thunkify = reuqire('thunkify');
var fs = require('fs');
var read = thunkify(fs.readFile);
read('xxx')(function(err, str)){
//...
}
co模块
- co模块是TJ Holowaychuk于2013年6月发布的一个小工具,用于Generator函数的自动执行
var gen = function*(){
var f1 = yield readFile('/etc/fstab');
var f2 = yield readFile('/etc/shells');
console.info(f1.toString());
console.info(f2.toString());
}
async函数
async函数就是Generator函数的语法糖
Generator
function* foo() {
var result = yeild readFile('1');
var result1= yeild readFile('2');
console.info(result1);
}
async
async function foo() {
var result = await readFile('1');
var result1= await readFile('2');
console.info(result1);
}
更多内容请自行深入挖掘 Promise Generator Aysnc
原文地址:https://www.cnblogs.com/pengsn/p/12855275.html
- 一个SQL性能问题的优化探索(一)(r11笔记第33天)
- HDUOJ-----1074 Integer Inquiry
- PXE无人值守安装Linux
- HDUOJ-----Robot Motion
- 对康托展开的一些心得...
- MySQL 5.7 General Tablespace学习(r11笔记第34天)
- Veeam Backup & Replication(一):安装及配置
- HDUOJ-----Computer Transformation
- Veeam Backup & Replication(二):添加虚拟化主机和配置备份存储
- HDUOJ 2672---god is a girl 《斐波那契数》
- Golang语言--一些基础用法
- 复杂SQL性能优化的剖析(一)(r11笔记第36天)
- hduoj1073--Online Judge
- Golang语言--- channel
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)
- 树状数据库表查询2次以上(自连接、内连接、别名)方法
- 网页背景H5视频自动播放---PC端、移动端兼容问题完美解决方案(IOS、安卓、微信端)
- 【STM32F407】第11章 RL-TCPnet V7.X之TCP服务器
- 如何解决nodejs中cpu密集型的任务
- 博客园主题1【备份】
- 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇)
- POSTGRESQL 到底怎么访问同instance 的库--
- 简单工厂模式
- 这 9 种方法有效帮你提高国内访问 Github 的速度
- python实现sm2和sm4国密(国家商用密码)算法
- 面试常考算法之区间问题
- 爬虫 | JS逆向某验滑动加密分析
- LeetCode | 28.实现strStr()
- Redis | Redis 哈希相关命令