首页 > 其他分享 >generator & async await

generator & async await

时间:2023-02-11 09:44:46浏览次数:30  
标签:console log generator await value next done async

Generator 和 Async 简介

在讲Generator之前, 咱们要来先了解另外一个概念, 迭代器.

迭代器 Iterator

迭代器Iterator 是 ES6 引入的一种新的遍历机制,同时也是一种特殊对象,它具有一些专门为迭代过程设计的专有接口。

每个迭代器对象都有一个next()方法,每次调用都返回一个当前结果对象。当前结果对象中有两个属性:

  1. value:当前属性的值

  2. done:用于判断是否遍历结束,当没有更多可返回的数据时,返回true

每调用一次next()方法,都会返回下一个可用的值,直到遍历结束。

生成器 Generator

生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的关键字yield。星号可以紧挨着function关键字,也可以在中间添加一个空格.

function* generator() {
    const list = [1, 2, 3];
    for (let i of list) {
        yield i;
    }
}


let g = generator();

console.log(g.next()); // {value: 1, done: false}
console.log(g.next()); // {value: 2, done: false}
console.log(g.next()); // {value: 3, done: false}
console.log(g.next()); // {value: undefined, done: true}

特性

  1. 每当执行完一条yield语句后函数就会自动停止执行, 直到再次调用next();
  2. yield关键字只可在生成器内部使用,在其他地方使用会导致程序抛出错误;
  3. 可以通过函数表达式来创建生成器, 但是不能使用箭头函数
    let generator = function *(){}

Async 和 Await

这个就比较简单了, 非常常用, 就不多赘述了.

想知道怎么封装一个函数, 能够让generator自动执行到完毕?

<!--async-->

function longTimeFn(time) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(time);
        }, time);
    })
};


function asyncFunc(generator) {
    const iterator = generator(); // 接下来要执行next
    // data为第一次执行之后的返回结果,用于传给第二次执行
    const next = (data) => {
        const {
            value,
            done
        } = iterator.next(data); // 第二次执行,并接收第一次的请求结果 value 和 done

        if (done) return; // 执行完毕, 直接返回
        // 第一次执行next时,yield返回的 promise实例 赋值给了 value
        value.then(data => {
            next(data); // 当第一次value 执行完毕且成功时,执行下一步(并把第一次的结果传递下一步)
        });
    }
    next();
};

asyncFunc(function* () {
    let data = yield longTimeFn(1000);
    console.log(data);
    data = yield longTimeFn(2000);
    console.log(data);
    return data;
})
<!--generator-->
function longTimeFn(time) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(time);
        }, time);
    })
};

function* generator() {
    const list = [1, 2, 3];
    for (let i of list) {
        yield i;
    }
}

let g = generator();

console.log(g.next()); // {value: 1, done: false}
console.log(g.next()); // {value: 2, done: false}
console.log(g.next()); // {value: 3, done: false}
console.log(g.next()); // {value: undefined, done: true}

标签:console,log,generator,await,value,next,done,async
From: https://www.cnblogs.com/DTCLOUD/p/17110901.html

相关文章

  • asyncio - OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。
    Exceptionincallback_ProactorBasePipeTransport._call_connection_lost(None)handle:<Handle_ProactorBasePipeTransport._call_connection_lost(None)>Traceback......
  • .Net6对AOP的多种支持之IAsyncResourceFilter
     环境:.Net6Web项目Mvc结构开发工具:VS2022IAsyncResourceFilter(资源缓存异步)IAsyncResourceFilter扩展   ASP.NETCore6提供的是接口IAsyncResourceFilter......
  • C# 学习async/await(个人理解)
    await:等待的意思async:异步(非同步) 当我们方法内部  存在await的时候,就返回出去执行下一步,等await后面的方法执行完毕在执行await下面的方法 一、我们......
  • 异步函数(async)的委托类型
    例如,某个委托类型如下:publicdelegateTaskRequestDelegate(HttpContextcontext);根据上面的签名,定义的两个 “示例” 函数如下:【传统的】publicTaskMyTestA(H......
  • JavaScript 的async、await功能
    asyncfunctionasyncfunction说明和C#中的使用类似。不过Task在Javascript中使用的是Promise对象。asyncfunction的返回值asyncfunctiontestAsyncFunction(){......
  • async,await
    注意点:①async/await是ES7新特性②async/await是写异步代码的新方式,以前的方法有回调函数和Promise③async/await是基于Promise实现的,它不能用于普通的回调函数④a......
  • NoClassDefFoundError: Could not initialize class MinioAsyncClient
    场景之前springboot集成的minio突然报错了,导致图片和附件查看和上传都出现问题。经过查看服务日志,提示错误如下java.lang.NoClassDefFoundError:Couldnotinitiali......
  • Android AsyncTask实现异步任务的执行
    Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新......
  • 异步编程(协程asyncio)
    协程1.异步非阻塞,asyncio2.异步框架:提升性能tomadofastapidjango3.xasgiaiohttp协程是什么协程是不是计算机提供出来的,程序员自己创建的。​协程(corout......
  • Spring异步Async和事务Transactional注解
    Spring开发中我们我们常常用到@Transaction和@Async,但这2个注解加在一起很多的开发者不敢用,担心事务不生效。下面我们就仔细讲解一下这2个注解同时运用,文章用3个场景讲述它......