koa框架2 基础入门之generator、yield
koa框架2 基础入门之generator、yield
generator可以理解为一个可以分段执行内部代码的函数,通过yield分隔,yield接一个promise异步,这个异步完成,才能执行下一个代码片段。(异步的请求同步的写法)
就好像是将一个异步的操作,转为同步了,但是,不是很方便,因为每一个片段运行结束后,需要执行next()才能进行下一个片段。
创建generator
和普通函数差不多,不过,他需要在函数名的前面加一个*
星号,这个星号可以和function字母挨在一起,也可以和函数名挨在一起,但是,function和名字必须要有空格,不管星号挨谁。
function* name() {
}
function* name() {
}
function* () {
}
其中匿名函数的话,一般配合一个库runner。
创建就这样。
runner库
这个是一个用于自动执行generator函数的封装库,其代码如下:
function runner(_gen) {
return new Promise((resolve, reject) => {
var gen = _gen();
_next();
function _next(_last_res) {
var res = gen.next(_last_res);
if (!res.done) {
var obj = res.value;
if (obj.then) {
obj.then((res) => {
_next(res);
}, (err) => {
reject(err);
});
} else if (typeof obj == 'function') {
if (obj.constructor.toString().startsWith('function GeneratorFunction()')) {
runner(obj).then(res => _next(res), reject);
} else {
_next(obj());
}
} else {
_next(obj);
}
} else {
resolve(res.value);
}
}
});
}
有需要自行复制然后存储为js文件,再应用,然后调用runner()
,将generator作为参数传给runner就行了。
generator基本用法
function* ge() {
console.log(1);
yield;
console.log(2);
};
let g = ge();
g.next();
g.next();
这里创建了ge函数,ge被yield分成两段代码,第一段输出1,第二段输出2。
然后我们运行这个函数,并赋值给g变量。因为generator不会直接运行里面的函数,他需要运行一次next才执行一次代码,所以我们next两次才运行完两段代码。
这就是他和传统函数的不同之处。
yield
他的作用实际上是将后面的代码,行内哈,不是后面的代码段,一般情况下yield后面是要接异步请求的,他会将异步请求抛出,然后外部获取到这个异步运行后,异步返回数据,然后执行next。
使用runner
runner(function*() {
let user = yield $.ajax({
url: "xxx/api",
dataType: "json"
});
let items = null;
if (user.login) {
items = yield $.ajax({
url: "xxx/api",
dataType: "json"
});
} else {
if (user.vip) {
items = yield $.ajax({
url: "xxx/api",
dataType: "json"
});
} else {
items = yield $.ajax({
url: "xxx/api",
dataType: "json"
});
}
}
console.log(items);
});
这里我们判断用户是否登录,未登录获取未登录的数据,已登录判断是否是vip,是vip获取vip数据,不是则获取普通数据。
这里我们使用了runner自动运行next。
这种写法和传统ajax请求写法不同,传统的ajax请求如果按照这种要求,起码要嵌套好几次ajax才行,而这里基本上都在一个作用域内。能做到这样也是因为他这个方式,异步的请求同步的写法。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据