我在expressjs有一点经验。基本上你用req,res和next实现一个函数。
function myMidWare (req, res, next) {
// do mid ware work
next() // call next to trigger next middleware
}
稍后,我会看到使用nodejs 8的koa代码。
这是here的一段代码:
var sha1 = require('sha1');
// define a Koa middle ware
module.exports = function(opts){
return function *(next){
var token = opts.token;
var signature = this.query.signature;
var nonce = this.query.nonce;
var timestamp = this.query.timestamp;
var echostr = this.query.echostr;
var str = [token,timestamp,nonce].sort().join('');
var sha = sha1(str);
this.body = (sha === signature) ? echostr + '' : 'failed';
};
}
下面是使用上面定义的Koa中间件的app.js
// app.js - using the Koa middle ware
'use strict'
var Koa = require('koa');
var wechat = require('./wechat/generator');
var config = {
wechat:{
appID:'...',
appSecret:'...',
token:'...'
}
};
var app = new Koa();
app.use(wechat(config.wechat));
app.listen(8080);
然后,我从MDN那里了解到iterator function*。功能*声明应该有'产生'关键词,但我无法找到'产生'上面代码中生成器函数定义中的关键字。
问题:
为什么他们定义一个没有' yield'关键词?
koa如何使用生成器函数控制中间件执行序列?
答案 0 :(得分:0)
使用新的await语法,我们可以在中间停止函数执行,等待某事(例如数据库调用),然后继续执行:
await dbcall();
await next();
在ES7之前的异步代码导致回调和承诺地狱,唯一支持中间产生的是生成器函数。它创建了一种简单的方法来委派操作并在完成后重新执行执行。一个小例子是:
function asy(func){
var gen = func();
(function next(v){
var res = gen.next(v);
res.value.then(v => res.done || next(v));
})();
}
所以你可以这样做:
asy(function* (){
var v = yield Promise.resolve("test");
console.log(v);
});
深入解释整个原则here
所以最后要回答你的问题:如果函数不需要屈服,则无需屈服;)