迭代器-生成器
什么是迭代器
const arrs = [1, 2, 3, 4, 5, 6]
let index = 0
const arrIterator = {
next() {
if(index < arrs.length) {
return { done: false, value: arrs[index++] }
}else {
return { done: true, value: undefined }
}
}
}
console.log(arrIterator.next())
console.log(arrIterator.next())
console.log(arrIterator.next())
console.log(arrIterator.next())
console.log(arrIterator.next())
console.log(arrIterator.next())
console.log(arrIterator.next())
生成迭代器的函数封装
function createArrayIterator(arr){
let index = 0
return {
next() {
if(index < arr.length){
return { done: false, value: arr[index++] }
}else{
return { done: true, value: undefined }
}
}
}
}
const arrs = [1,2,3]
const names = ['aaa','bbb','ccc']
const arrIterator = createArrayIterator(arrs)
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
const nameIterator = createArrayIterator(names)
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
function createNumberIterator() {
let index = 0
return {
next() {
return { done: false, value: index++ }
}
}
}
const numberIterator = createNumberIterator()
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
console.log(numberIterator.next());
什么是可迭代对象
const iterableObj = {
names: ['aaa', 'bbb', 'ccc'],
[Symbol.iterator]: function(){
let index = 0
return {
next: () => {
if(index < this.names.length) {
return { done: false, value: this.names[index++] }
}else {
return { done: true, value: undefined }
}
}
}
}
}
console.log(iterableObj[Symbol.iterator]);
const iterator1 = iterableObj[Symbol.iterator]()
console.log(iterator1.next());
console.log(iterator1.next());
console.log(iterator1.next());
console.log(iterator1.next());
for(const value of iterableObj){
console.log(value);
}
console.log(Symbol.iterator)
原生内置可迭代对象
const names = ['aaa', 'bbb', 'ccc']
const set = new Set()
set.add(10)
set.add(100)
set.add(1000)
console.log(set[Symbol.iterator]);
for(const item of set) {
console.log(item);
}
function foo(x, y, z) {
console.log(arguments[Symbol.iterator])
for(const arg of arguments) {
console.log(arg);
}
}
foo(1, 2, 3)
可迭代对象的应用场景
const names = ['aaa', 'bbb', 'ccc']
const newNames = [ ...names ]
console.log(newNames)
const obj = {
name: 'Fhup',
age: 18
}
const newObj = { ...obj }
console.log(newObj);
const [a,b,c, d = 'ddd'] = names
console.log(a, b, c, d);
const {age, name} = obj
console.log(name, age);
const set = new Set(names)
console.log(set)
const arr1 = Array.from(names)
console.log(arr1);
Promise.all(names).then(res=>{
console.log(res);
})
自定义类的可迭代性(监听中断)
class Person {
constructor(address, name, students) {
this.address = address
this.name = name
this.students = students
}
entry(newStudent){
this.students.push(newStudent)
}
[Symbol.iterator]() {
let index = 0
return {
next: ()=>{
if(index < this.students.length) {
return { done: false, value: this.students[index++] }
}else {
return { done: true, value: undefined }
}
},
return: ()=>{
console.log('迭代器提前终止了~')
return { done: true, value: undefined }
}
}
}
}
var p = new Person('12b-321', 'shehui', ['xiaohong', 'xiaozhang', 'ludehua'])
p.entry('zhoujielun')
for(const stu of p) {
console.log(stu);
if(stu === 'ludehua') break
}
什么是生成器函数
function* foo() {
console.log('函数开始执行');
console.log('第一段', 'aaaaaaaa');
yield
console.log('第二段', 'bbbbbbb');
yield
console.log('第三段', 'cccccc');
yield
console.log('函数执行结束');
}
const generator = foo()
generator.next()
generator.next()
generator.next()
generator.next()
console.log('---------');
generator.next()
console.log('--------');
生成器函数的执行流程
function* foo() {
console.log('函数开始执行');
console.log('第一段', 'aaaaaaaa');
yield 'one'
console.log('第二段', 'bbbbbbb');
yield 'two'
console.log('第三段', 'cccccc');
yield 'three'
console.log('函数执行结束');
return '123'
}
const generator = foo()
console.log('返回值1:', generator.next());
console.log('返回值2:', generator.next());
console.log('返回值3:', generator.next());
console.log('返回值4:', generator.next());
生成器next传递参数
function* foo (index){
console.log('函数开始执行');
console.log('第一段', 'aaaaaaaa', ', index:', index);
const num = yield 'one'
console.log('第二段', 'bbbbbbb', ', num:', num);
yield 'two'
console.log('第三段', 'cccccc');
yield 'three'
console.log('函数执行结束');
return '123'
}
const generator = foo(999)
generator.next()
generator.next(100)
generator.next()
generator.next()
生成器return终止执行
function* foo (){
console.log('函数开始执行');
console.log('第一段', 'aaaaaaaa');
const num = yield 'one'
console.log('第二段', 'bbbbbbb', ', num:', num);
yield 'two'
console.log('第三段', 'cccccc');
yield 'three'
console.log('函数执行结束');
return '123'
}
const generator = foo()
console.log(generator.next());
console.log(generator.return(15));
生成器throw抛出异常
function* foo() {
console.log('函数开始执行');
console.log('第一段', 'aaaaaaaa');
try {
yield 'one'
} catch (err) {
console.log('捕获异常:',err);
yield 'catch里yield'
}
console.log('第二段', 'bbbbbbb');
yield 'two'
console.log('第三段', 'cccccc');
yield 'three'
console.log('函数执行结束');
return '123'
}
const generator = foo()
console.log(generator.next());
console.log(generator.throw('err message~'));
生成器替代迭代器
function* createArrayIterator(arr) {
yield* arr
}
const names = ['aaa', 'bbb', 'ccc']
const arrayIterator = createArrayIterator(names)
console.log(arrayIterator.next());
console.log(arrayIterator.next());
console.log(arrayIterator.next());
console.log(arrayIterator.next());
console.log('--------------------------');
function* createRangeIterator(start, end) {
while(start <= end){
yield start++
}
}
const rangeIterator = createRangeIterator(10, 20)
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
console.log(rangeIterator.next());
class Person {
constructor(address, name, students) {
this.address = address
this.name = name
this.students = students
}
entry(newStudent){
this.students.push(newStudent)
}
foo = function(){
};
*[Symbol.iterator]() {
yield* this.students
}
}
const p = new Person('12b-321', 'shehui', ['xiaohong', 'xiaozhang', 'ludehua'])
p.entry('zhoujielun')
for(const stu of p) {
console.log(stu);
}
异步代码的处理方案
function requestData(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(url)
}, 2000);
})
}
async function getData() {
const res1 = await requestData("Fhup")
const res2 = await requestData(res1 + "aaa")
const res3 = await requestData(res2 + "bbb")
const res4 = await requestData(res3 + "ccc")
console.log(res4)
}
getData()