【问题标题】:Why does koa use generator function as middleware without 'yield' keyword?为什么 koa 使用生成器函数作为没有'yield'关键字的中间件?
【发布时间】:2017-08-15 20:00:27
【问题描述】:

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

问题:

  1. 为什么他们定义一个没有'yield'关键字的生成器函数?

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

【问题讨论】:

  • yield 就像一个伪等待。
  • @Jonasw 我理解 await 关键字。为什么这个中间件需要迭代器函数而不是普通函数?

标签: javascript node.js koa


【解决方案1】:

使用新的 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

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

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 2011-05-18
    • 2011-11-02
    • 2019-09-10
    • 2017-11-18
    • 2016-12-02
    • 2021-10-26
    • 2018-01-23
    相关资源
    最近更新 更多