主要介绍function* 函数生成器的作用及其使用
直接复制粘贴代码即可使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
</body>
<script>
// 1、函数生成器特点是函数名前面有一个‘*’
// 2、通过调用函数生成一个控制器
// 3、调用next()方法开始执行函数
// 4、遇到yield函数将暂停
// 5、再次调用next()继续执行函数
// function* fn() {
// console.log(1);
// //暂停!
// yield;
// //调用next方法继续执行
// console.log(2);
// }
// var iter = fn();
// iter.next(); //1
// iter.next(); //2
// --------------------------------------------
// function* fn() {
// var a = yield 'hello';
// yield;
// console.log(a);
// }
// var iter = fn();
// var res = iter.next();
// console.log(res.value); //hello
// iter.next(2);
// iter.next(); //2
// 可以看到,yield后面有一个字符串,在第一次调用next时,暂停在这里且返回给了iter.next()。
// 而暂停的地方是一个赋值语句,需要一个变量给a,于是next()方法中传了一个参数2替换了yield,最后打印a得到了2。
// -------------------------------------------------------------
// function fn(a, b) {
// //假设这是一个ajax请求
// ajax('url' + a + b, function(data) {
// //数据请求到会执行it.next
// it.next(data);
// });
// }
// //这里是函数生成器
// function* g() {
// //当异步操作完毕yield会得到值
// //这里会自动继续执行
// var text = yield fn(a, b);
// console.log(text);
// }
// var it = g();
// it.next();
// ------------------------------------------------------------
// 等待promise决议值返回
// function* fn(x) {
// var text = yield foo(1);
// yield foo(x);
// function foo(x) {
// return new Promise(function(resolve, reject) {
// //ajax异步请求完成会调用resolve决议
// // ajax(url, resolve);
// var url = 'url:' + x
// setTimeout(() => {
// resolve(url+'1231412412')
// }, 2000);
// });
// }
// }
// var it = fn();
// //返回一个promise
// var p = it.next().value;
// //对promise处理
// p.then(function(text) {
// //这里继续执行生成器
// let val = it.next(text).value;
// // console.log(text)
// // console.log(val)
// })
function run(gen) {
//获取除了生成器本身以外的参数
var args = [].slice.call(arguments, 1),
it;
it = gen.apply(this, args);//调用生成器 类似上面 var it = fn();
// Promise.resolve('foo');等价于
// new Promise(resolve => resolve('foo'));
return Promise.resolve().then(function handleNext(value) {
//第一次启动无value
var next = it.next(value);
return (function handleResult(next) {
//执行完毕返回
if (next.done) {
return next.value;
} else {
//如果还有就决议next.value传给handleNex
return Promise.resolve(next.value).then(handleNext, (err)=> { console.log(err) });
}
})(next);
});
}
//这是一个函数生成器
function* main() {
//这种方式可以在获取到前两个异步请求后
//再次根据前两个请求结果获取第三个请求
let ur1 = '请求ur1';
let ur2 = '请求ur2';
let ur3 = '请求ur3';
let r1 = yield requst(ur1);
let r2 = yield requst(ur2);
let r3 = yield requst(ur3+r1+r2);
console.log(r3);
// 模拟异步请求
function requst(x) {
return new Promise(function(resolve, reject) {
//ajax异步请求完成会调用resolve决议
// ajax(url, resolve);
var url = 'url:' + x
setTimeout(() => {
resolve(url)
}, 2000);
});
}
};
//该调用会自动异步运行直到结束
run(main);
</script>
</html>