异步操作和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