CNode

koa里面yield next 与 yield* next的区别?

问答
WWeb-Kevin发布于10 年前最后回复10 年前8 回复7422 浏览0 收藏

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

查看回复

回复 (8)

W
Web-Kevin#3·10 年前
引用 magicdawn@Web Kevin 别用 yield 就好

@magicdawn 中间件编写也这样么

W
Web-Kevin#5·10 年前

@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

M
magicdawn#6·10 年前

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

参与回复
登录后即可参与回复。登录