今天开始和大家一起系统的学习ES6+,每天3分钟,用一把斗地主的时间,重学ES6+,前面我们介绍了迭代器今天继续介绍生成器和生成器函数
我们新建一个生成器函数foo,通过yield 分割。当执行一次next是,遇到yield 会自动中断,
这样函数就可以通过我们在外部控制一步一步执行。
//生成器函数
function* foo(){
console.log(1)
const value1 =10
console.log(value1)
const n = yield value1 //可以在中断的时候返回值
const value2 =20 * n
console.log(value2)
yield
const value3 =30
console.log(value3)
yield
console.log(2)
}
const generator = foo()
generator.next()
generator.next(100) //可传入值 generator.next()
const value1 = 100
try {
yield value1
} catch (error) {
console.log("捕获到异常情况:", error)
yield "abc" // 不会执行
}
console.log("第二段代码继续执行")
const value2 = 200
yield value2
function* createArrayIterator(arr) {
// 3.第三种写法 yield*
yield* arr
// 2.第二种写法
// for (const item of arr) {
// yield item
// }
// 1.第一种写法
// yield "abc" // { done: false, value: "abc" }
// yield "cba" // { done: false, value: "abc" }
// yield "nba" // { done: false, value: "abc" }
}
const names = ["abc", "cba", "nba"]
const namesIterator = createArrayIterator(names)
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
console.log(namesIterator.next())
介绍了我们前面的Promise、生成器等,我们目前来看一下异步代码的最终处理方案。
function requestData(url) {
// 异步请求的代码会被放入到executor中
return new Promise((resolve, reject) => {
// 模拟网络请求
setTimeout(() => {
// 拿到请求的结果
resolve(url)
}, 2000);
})
}
function* getData() {
const res1 = yield requestData("url")
const res2 = yield requestData(res1 + "aaa")
const res3 = yield requestData(res2 + "bbb")
const res4 = yield requestData(res3 + "ccc")
console.log(res4)
}
但是上面的代码其实看起来也是阅读性比较差的,有没有办法可以继续来对上面的代码进行优化呢?
function* getData(){
const res1 = yield requestData("why")
const res2 = yield requestData(res1+'bbb')
const res3 = yield requestData(res2+'ccc')
console.log(res3)
}
// 1> 手动执行生成器函数
const generator = getData()
generator.next().value.then(res => {
generator.next(res).value.then(res => {
generator.next(res).value.then(res => {
generator.next(res)
})
})
})
// 2> 自己封装了一个自动执行的函数
function execGenerator(genFn) {
const generator = genFn()
function exec(res) {
const result = generator.next(res)
if (result.done) {
return result.value
}
result.value.then(res => {
exec(res)
})
}
exec()
}
execGenerator(getData)
这其实也就是我们ES6中提出的generator 生成器函数,也是为了解决promise 异步回调地狱的问题。同是也增加了代码量,不太语义化,因此后面又提出了async/await
阅读量:2016
点赞量:0
收藏量:0