我转过几个弯 绕过那个小雨楼
拿着蒲扇摆着衣衫渡着紧箍咒
不问天涯不停留 喝过几壶酒
不过年少白头道义放胸口
倘若明天之后 遥看前尘剑封侯
似那天上神仙无所求
朝朝暮暮君如梦醒十分不为何理由
是真是假是惶恐是无休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
又过了几个弯 算尽天量道莫慌
踏这田园闻这芳草香
跌跌撞撞仗剑天涯折煞不枉无笔良
是梦是幻是温柔是家乡
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
谁能与我一醉方休
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才行,而这里基本上都在一个作用域内。能做到这样也是因为他这个方式,异步的请求同步的写法。
评论(0)