zoukankan      html  css  js  c++  java
  • 异步操作和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

  • 相关阅读:
    django orm 以列表作为筛选条件进行查询
    申请Let's Encrypt通配符HTTPS证书
    redis集群部署及踩过的坑
    MySQL的索引是什么?怎么优化?
    Session管理之超时设置和强制下线
    在MySQL中使用explain查询SQL的执行计划
    基于Docker搭建MySQL主从复制
    这些年一直记不住的 Java I/O
    高并发大容量NoSQL解决方案探索
    php 如何生成静态页
  • 原文地址:https://www.cnblogs.com/pengsn/p/12855275.html
Copyright © 2011-2022 走看看