ECMAScript6 Generator & async
Generator
Generator函数是一个状态机,执行后返回一个遍历器对象。调用遍历器对象的.next()函数获取下一个状态.
Generator是一个普通的函数,函数内部使用yield关键字定义内部的不同状态.每次调用到yield表达式函数暂停执行
语法
function * name(){
for(let i=0;i<10;i++){
yield i*i;
}
return null;
}
var gn = name();
gn.next();//1
gn.next();//4
Generator函数的数据交换和错误处理
数据交互
function * gen(x){
var y = yield x + 2;
return y;
}
var g = gen(1);
g.next();//3
g.next(1);//2
Generator 函数传入参数与普通函数的作用相同。调用next时传入的参数会作为上次一yield的返回值传入,所以第二次调用next返回值为2.
错误处理
function * gen(x){
try{
var y = yield x + 1;
}catch(e){
console.log(e);
}
return y;
}
var g = gen(1);
g.next();//3
g.throw('error throw!');
//error throw!
异步任务的封装
例子:
function * gen(url){
var result = yield fetch(url);
console.log(result);
}
var g = gen('http://xxxx/api');
var result = g.next();
result.value.then(d=>d.json()).then(d => g.next(d));
上面的例子有两步,第一步是调用API获取数据,第二部是打印获取的数据到控制台.
async 函数
async是Generator函数的语法糖
改进点:
- 内置执行器,不需要调用next方法。
- 语义改进,async标识函数里面包括异步操作,await标识后面的表达式需要等待
- async函数返回的是Promise对象
async 命令把多个异步操作包装成一个Promise对象
基本用法
async function getStockPriceByName(name) {
const symbol = await getStockSymbol(name);
const stockPrice = await getStockPrice(symbol);
return stockPrice;
}
getStockPriceByName('goog').then(function (result) {
console.log(result);
});
获取股票的报价,包括多个异步调用,最后返回股票报价,包装成promise对象.
ECMAScript6 Generator & async的更多相关文章
- Promise, Generator, async/await的渐进理解
作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...
- 一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async
JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选 ...
- ES6 Generator async
Generator 函数是 ES6 提供的一种异步编程解决方案 async 函数使得异步操作变得更加方便,是 Generator 函数的语法糖. js单线程的原因是:避免DOM渲染冲突! 更新:201 ...
- js中异步方案比较完整版(callback,promise,generator,async)
JS 异步已经告一段落了,这里来一波小总结 1. 回调函数(callback) setTimeout(() => { // callback 函数体 }, 1000) 缺点:回调地狱,不能用 t ...
- Generator function vs Async/Await
Generator function vs Async/Await generator async /await refs xgqfrms 2012-2020 www.cnblogs.com 发布文章 ...
- Generator的正确打开方式
前两年大量的在写Generator+co,用它来写一些类似同步的代码但实际上,Generator并不是被造出来干这个使的,不然也就不会有后来的async.await了Generator是一个可以被暂停 ...
- JS前端重点 -- Generator 函数的含义与用法
Generator 函数的含义与用法 1.generator http://www.ruanyifeng.com/blog/2015/04/generator.html http://it.taocm ...
- 前端Tips#6 - 在 async iterator 上使用 for-await-of 语法糖
视频讲解 前往原文 前端Tips 专栏#6,点击观看 文字讲解 本期主要是讲解如何使用 for-await-of 语法糖进行异步操作迭代,让组织异步操作的代码更加简洁易读. 1.场景简述 以下代码中的 ...
- 深入浅出mongoose
深入浅出mongoose mongoose是nodeJS提供连接 mongodb的一个库. 此外还有mongoskin, mongodb(mongodb官方出品). 本人,还是比较青睐mongoose ...
随机推荐
- (C++学习)关于CString的一些疑问
#include <iostream> #include <string> #include <afx.h> #include <vector> usi ...
- Spring 数据传入
表单传入 前端代码: <form method="POST" id="user_login_submit"> <div class=" ...
- 限流(三)Redis + lua分布式限流
一.简介 1)分布式限流 如果是单实例项目,我们使用Guava这样的轻便又高性能的堆缓存来处理限流.但是当项目发展为多实例了以后呢?这时候我们就需要采用分布式限流的方式,分布式限流可以以redis + ...
- System.arraycopy的测试
ArrayList的源码中数组的拷贝用到该方法: public static void arraycopy(Object src, --源数组 int srcPos, --源数组要复制的起始位置 Ob ...
- About custom Theme and Style
For android system, of course you can custom your own style and theme, but you can't break compatibi ...
- Thrift笔记(七)--回调源码分析
网上找了写代码,东拼西凑写了个demo.开始server用的是阻塞io,不行,换成非阻塞的io就可以.这里可能需要注意下 thrift文件 namespace java com.gxf.thrift ...
- Effective C++ .08 别让异常逃离析构函数
异常不怎么用,C++能自己控制析构过程,也就有这个要求了.容器不能完全析构其中的元素真是太危险了
- 判断sql是否存在特定的对象
1 判断数据库是否存在if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断表是否存 ...
- typeof()和instanceof()用法区别
typeof()和instanceof()用法区别: 两者都是用来判断数据类型的 typeof()是能用来判断是不是属于五大类型Boolean,Number,String,Null,Undefined ...
- UFW Essentials: Common Firewall Rules and Commands
Introduction UFW is a firewall configuration tool for iptables that is included with Ubuntu by defau ...