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/