首页 > 其他分享 >Generator函数异步应用

Generator函数异步应用

时间:2022-10-22 21:22:43浏览次数:57  
标签:function 异步 函数 Generator yield next var

协程

协程的流程:协程A执行,执行到一半就将执行权转移给协程B,协程B交还执行权,然后A恢复执行。

如下所示:

function* asyncJob(){
    ...
    var f=yield readFile(fileA);//分界,执行到此处时会将执行权交给其它协程。
    ...
}

Generator函数是协程在ES6的实现,整个Generator函数就是一个封装的异步函数,任何需要异步操作暂停的地方,都要用yield来注明.

function* gen(x){
    var y=yield x+2;
    return y;
}
var g=gen(1);
g.next();
g.next();
//异步操作需要暂停的地方都要用yield注明

使用Generator可以指定上一步异步操作的返回结果:

function* gen(x){
    var y=yield x + 2;
    return y;
}
var g=gen(1);
g.next();//{value:3,done:false}
g.next(2);//{value:2,done:true}直接传进到上一步的异步操作中接收,被y接收
g.throw('出错')//在生成函数内部使用try...catch可以实现分离出错代码和处理错误的代码

使用Generator函数来封装异步操作:

var fetch=require('node-fetch');
function* gen(){
    var url='...';
    var result=yield fetch(url);
    console.log(result.bio);
}
var g=gen();
var result=g.next();//result是一个Promise对象。

Thunk函数

Thunk函数是自动执行Generator函数的一种方式,相当于传入表达式调用时求值,Thunk也是一种延迟求值的方法.

//传值调用和传名调用
//传值调用,在传入参数前先算出x+5的值。
f(x + 5)
//传名调用,传入表达式,传入后用到时再进行计算。
f(x+5)
(x+5)*2

Thunk函数将多参数函数替换为只接受回调函数作为参数的单参数函数。

//替换前
fs.readFile(fileName,callback);
//替换后
var Thunk=function(fileName){
    return function(callback){
        return fs.readFile(fileName,callback);
    }
    }
var readFileThunk=Thunk(fileName);
readFileThunk(callback);
function f(a,b,callback){
    var sum=a+b;
    callback(sum);
    callback(sum);
}
var ft=thunkify(f);
var print=console.log.bind(console);
ft(1,2)(print);

Thunk函数的自动流程管理

对于Generator函数来说,使用异步函数,配合Thunk函数可以实现不断回调自动执行。

function run(fn) {
  var gen = fn();
  function next(err, data) {
    var result = gen.next(data);
    if (result.done) return;
    result.value(next);
  }
  next();
}
var g = function* (){
  var f1 = yield readFileThunk('fileA');
  var f2 = yield readFileThunk('fileB');
  // ...
  var fn = yield readFileThunk('fileN');
};
run(g);

co模块

好难不会,就是说Promise和Thunk都能处理这种方式的异步调用吧

标签:function,异步,函数,Generator,yield,next,var
From: https://www.cnblogs.com/mengyiqwq/p/16817343.html

相关文章

  • 10月22号:学习日记(函数)
    C语言中函数的分类1.库函数(在使用过程中频繁使用)2.自定义函数#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>intmain(){//strcpy-stringc......
  • SQL进阶篇之函数
    SQL拥有很多可用于计数和计算的内建函数函数的语法SELECTfunction(列)FROM表函数类型Aggregate函数:操作面向一系列的值,并返回一个单一的值(注:如果在SELECT语句......
  • linux下使用gcc编译含gets()函数的程序
    网上有很多关于gets()会导致栈溢出之类的废话也许会有初学者望着千篇一律的回答茫然无错,以为真的就只能使用fgets()了 首先你要了解gets()函数有极大的风险其次,在gcc......
  • 对函数重载的理解
    函数重载其实是方法的多态性的一种体现函数重载其实严格来说是一种方法名称重用的功能,利用特定的机制可以让一个方法实现不同的功能方法重载的实现方法的名称相同(强......
  • devexpress中grid控件教程 多线程异步加载数据,进度条展示
    devexpress中最强大的控件,要数它的Grid了。几乎任务数据都可以展示,但今天要用它做另一个功能。假设我们开发这样一款软件:视频编辑软件。里面有个功能,提取视频中的音频。一......
  • 【python】高阶函数
    什么是高阶函数?只要满足下面的任意一个条件就是高阶函数1、一个函数的函数名作为参数传给另外一个函数2、一个函数返回值(return)为另外一个函数(返回为自己,则为递归)......
  • 利用redis作为消息队列实现异步秒杀业务
    实现消费券秒杀的优化,在加入限时抢购的优惠券时,自动的将消费券的库存stock信息也加入到redis中(可设为抢购结束后过期)抢购之前在redis中进行库存是否充足(stock)、用户是否已......
  • 一文打通Lambda 表达式和函数式接口
    Lambda表达式为什么使用Lambda表达式Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更......
  • C语言网络接口函数inet_ntoa用法小坑与分析
    tags:CNetworkDebug问题今天看了一下网络编程,发现其中有一个接口函数很有意思,就是从二进制转换到点分十进制表示的IP地址的函数​​inet_ntoa()​​,直接使用倒是......
  • 三角函数的另外三个伙伴—cot,sec,csc
    原文网址:https://zhuanlan.zhihu.com/p/162297688?utm_source=qq二.知识讲解1.认识另外三个小伙伴首先说cot我估计部分高中生应该学过cot。它叫余切,和tan互为倒数。所......