迭代器

// log
let arr = ['一', '二', '三']
let iter = arr[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
// log
let args = {
info: 'some country or region',
list: ['china', 'USA', 'china hk'],
}
for (let item of args) {
console.log(item)
}
// log
let args = {
info: 'some country or region',
list: ['china', 'USA', 'china hk'],
[Symbol.iterator]() {
// 索引变量
let index = 0
return {
next: () => {
if (index < this.list.length) {
const result = { value: this.list[index], done: false }
index++
return result
} else {
return { value: undefined, done: true }
}
},
}
},
}
for (let item of args) {
console.log(item)
}

生成器

// log
function* gen() {
console.log('gen')
}
let iterator = gen()
iterator.next()
// log
function* gen() {
console.log('窗前明月光')
yield
console.log('疑是地上霜')
yield
console.log('举头望明月')
yield
console.log('低头思故乡')
yield
}
// 测试next()调用
let iterator = gen()
iterator.next()
iterator.next()
iterator.next()
iterator.next()
// log
function* gen() {
console.log('窗前明月光')
yield 'A'
console.log('疑是地上霜')
yield 'B'
console.log('举头望明月')
yield 'C'
console.log('低头思故乡')
yield 'D'
console.log('完')
}
// 测试next()调用的返回值
let iter = gen()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
// log
function* gen(param) {
console.log('窗前明月光' + param)
let a = yield 'A'
console.log('疑是地上霜' + a)
let b = yield 'B'
console.log('举头望明月' + b)
let c = yield 'C'
console.log('低头思故乡' + c)
let d = yield 'D'
} let iter = gen('param参数')
console.log(iter.next('next参数一'))
console.log(iter.next('next参数二'))
console.log(iter.next('next参数三'))
console.log(iter.next('next参数四'))

生成器与异步

setTimeout(() => {
// log-async
console.log(1)
setTimeout(() => {
// log-async
console.log(2)
setTimeout(() => {
// log-async
console.log(3)
}, 100)
}, 100)
}, 100)

遇到 yield,就要停一下。

function* gen() {
yield one()
yield two()
yield three()
}
function one() {
setTimeout(() => {
// log-async
console.log(1)
}, 100)
} function two() {
setTimeout(() => {
// log-async
console.log(2)
}, 100)
} function three() {
setTimeout(() => {
// log-async
console.log(3)
}, 100)
} let iter = gen()
iter.next()
iter.next()
iter.next()
function* gen() {
let data1 = yield one()
let data2 = yield two()
let data3 = yield three()
// log-async
console.log(data3)
} let iter = gen() function one() {
setTimeout(() => {
let data = '用户数据'
// log-async
iter.next(data)
}, 100 * Math.random())
} function two() {
setTimeout(() => {
let data = '订单信息'
// log-async
iter.next(data)
}, 100 * Math.random())
} function three() {
setTimeout(() => {
let data = '产品信息'
// log-async
iter.next(data)
}, 100 * Math.random())
}
iter.next()

Promise

封装 Ajax

const p = new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest()
xhr.open('GET', 'https://api.apiopen.top/get')
xhr.send()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response)
} else {
reject(xhr.status)
}
}
}
})
p.then(null, (err) => {
// log-async
console.log(err)
})

细节:发出承诺起即new Promise()后,就开始执行里面的代码了,.then的作用将回调传进+链式调用。

new Promise((resolve, reject) => {
// log-async
console.log('开始同步了')
setTimeout(() => {
// log-async
console.log('开始异步了')
resolve(0)
}, 100)
})

then 方法返回一个 Promise

如果 then 里面不 return

  1. 返回之前的 promise

如果 then 里面 return

  1. return 非 promise:返回之前的 promise
  2. return promise:返回新的 promise
// log
let p = new Promise((resolve, reject) => {
console.log('开始同步了')
})
let res = p.then()
console.log(res[Symbol.toStringTag])

Symbol.toStringTag

相关原理见promise 原理

Set

最新文章

  1. 【项目记录】-液化气配送app android版
  2. C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》
  3. 文本编辑器VIM/VI
  4. Silverlight中文本框添加回车事件后,换行无法清除的解决方法
  5. 5.5---整数A转成整数B(CC150)
  6. NGUI之UIRoot屏幕分辨率自适应
  7. 去除重复命令uniq
  8. Retina
  9. VS 2012 插件卸载(删除自己安装的插件)
  10. 子进程管理模块subprocess
  11. 在线试听功能(前端直接略过吧,适合javaEE后台开发的)
  12. 是否有必要学习使用纯Verilog写一个SDRAM控制器
  13. java线程间通信之通过管道进行通信
  14. windows代码,路径分割
  15. [物理学与PDEs]第2章习题7 一维不可压理想流体的求解
  16. webToImage (网页转图片)模块试用分享
  17. 045 介绍UDF,以及完成大小写的转换
  18. AGC015 C-Nuske vs Phantom Thnook AtCoder 思路 前缀和
  19. Binary Tree ZigZag Level Order Traversal leetcode java
  20. grandstack 基于graphql&amp;&amp;react&amp;&amp; apollo&amp;&amp; neo4j 的全栈开发工具

热门文章

  1. C#LeetCode刷题之#122-买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
  2. myBatis源码解析-反射篇(4)
  3. oracle中表加锁死锁的现象、原因及解决方案
  4. Elasticsearch聚合语句
  5. docker-machine在阿里云部署批量部署docker
  6. CAS和锁的相关面试题
  7. Ubuntu图形桌面切换到命令行界面
  8. 七脚OLED屏幕使用IIC接口
  9. linux 基本命令整理--转
  10. latex:数学式中的省略符号