koa里面yield next 与 yield* next的区别?
发布于 8 年前 作者 Web-Kevin 6495 次浏览 来自 问答

最近有时间一直在看koa nc-example 的项目源码 有3个问题: 1.yield yield* lz知道他们俩的区别 但在koa里是否没有区别,因为都是调用下一个中间件? 2.后面的next是否都只下一个中间件? 3.一个中间件中是否只能有一个yield next或者yield* next?

8 回复

@ncuzp 的项目user_sess.js的代码

'use strict';

let path = require('path');
let User = require('../models').User;

// 需要过滤的文件后缀
let filterSuffix = [
	'.ico', '.js', 	 '.css', 
	'.jpg', '.jpeg', '.png', 
	'.gif'
];

module.exports = function* (next){
	// 不处理filterSuffix中包含的文件
	if(filterSuffix.indexOf(path.extname(this.request.url)) !== -1){
		yield next;
	}else{
		let loginname 	= this.session.loginname;
		let url 		= this.request.url;
		let userPromise = Promise.resolve();

		// 静态文件过滤
		if(loginname){
			yield Promise.resolve()
			.then(() => User.findOne({loginname: loginname}))
			.then((user) => {this.session.user = user || undefined;});
		}

		yield* next;
		// just let session record loginname before leave
		this.session.user = undefined;
	}
};

下面是koa guide里的一张图片,并没有用到 yield* https://github.com/koajs/koa/blob/master/docs/middleware.gif

yield next; // next 可以是任意值 yield* next; // next 必须是 generator yield* 不是标准, 不要使用, 据说新版已经删除了…

@magicdawn “yield* next; // next 必须是 generator” 不是必须 generator, 而是可迭代,要遵循迭代协议的对象。

https://github.com/fundon/ES6-QuickStart-and-Tips#generators

@magicdawn 也就是说yield* next 与 yield next在koa里是一样的作用对么?

@Web-Kevin

别用 yield* 就好

@magicdawn 中间件编写也这样么

回到顶部