koa路由的收益
yields in koa routing
我正在尝试弄清楚 yield 在 koa 路由中的使用。
举个例子,
router.get('/data', function *(next) {
this.body = yield someData;
});
如果我想发送静态文件,我可以像这样使用 koa-send :-
router.get('/data', function *(next) {
yield send(this, 'file.html');
});
但是,如果我将第二个收益分配给 this.body,它就不起作用。
那么
this.body = yield ...
实际上是什么意思,为什么我不需要将 2nd yield 分配给正文?
如果你查看 koa-send 库,你会注意到 this:
ctx.body = fs.createReadStream(path);
基本上库正在将流分配给 this.body
,然后当您尝试分配通过调用 yield send(this, 'file.html')
返回的内容时,它似乎是文件 path and name,您正在破坏/覆盖图书馆试图做的事情。
现在,如果您愿意,您可以选择不使用 koa-send
而只是这样做:
this.body = fs.createReadStream('file.html');
回答您的具体问题
this.body = yield ...
您在 Promise/thunk/generator 返回执行异步操作的函数时调用 yield(生成器内部),这会暂停函数的执行,直到异步任务完成,然后在结果为可用的。
前段时间我制作了一段关于理解 JavaScript 生成器的截屏视频,您可能会觉得有帮助:
http://knowthen.com/episode-2-understanding-javascript-generators/
我正在尝试弄清楚 yield 在 koa 路由中的使用。
举个例子,
router.get('/data', function *(next) {
this.body = yield someData;
});
如果我想发送静态文件,我可以像这样使用 koa-send :-
router.get('/data', function *(next) {
yield send(this, 'file.html');
});
但是,如果我将第二个收益分配给 this.body,它就不起作用。
那么
this.body = yield ...
实际上是什么意思,为什么我不需要将 2nd yield 分配给正文?
如果你查看 koa-send 库,你会注意到 this:
ctx.body = fs.createReadStream(path);
基本上库正在将流分配给 this.body
,然后当您尝试分配通过调用 yield send(this, 'file.html')
返回的内容时,它似乎是文件 path and name,您正在破坏/覆盖图书馆试图做的事情。
现在,如果您愿意,您可以选择不使用 koa-send
而只是这样做:
this.body = fs.createReadStream('file.html');
回答您的具体问题
this.body = yield ...
您在 Promise/thunk/generator 返回执行异步操作的函数时调用 yield(生成器内部),这会暂停函数的执行,直到异步任务完成,然后在结果为可用的。
前段时间我制作了一段关于理解 JavaScript 生成器的截屏视频,您可能会觉得有帮助:
http://knowthen.com/episode-2-understanding-javascript-generators/