为什么koa使用生成器函数作为中间件而没有' yield'关键词?

时间:2017-08-15 20:00:28

标签: javascript node.js koa

我在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*。功能*声明应该有'产生'关键词,但我无法找到'产生'上面代码中生成器函数定义中的关键字。

问题:

  1. 为什么他们定义一个没有' yield'关键词?

  2. koa如何使用生成器函数控制中间件执行序列?

1 个答案:

答案 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

所以最后要回答你的问题:如果函数不需要屈服,则无需屈服;)