为什么这个生成器返回一个函数而不是一个值

基本上,我试图做我的koa应用程序的HTTP请求,并想知道我会做错什么

var request = require('koa-request'); var beatsGen = beats(); var response1 = beatsGen.next().value; function *beats (){ var options = { url: 'https://api.github.com/repos/dionoid/koa-request', headers: { 'User-Agent': 'request' } }; var response = yield request(options); } 

当我控制日志响应1这是我得到的

 respone from beats is function (callback) { _request(uri, options, function (error, response, body) { callback(error, response); }) } 

我认为response1将是包含callback的body参数而不是函数本身的object的someType。 那么,为什么我得到的函数作为生成器.next()。值?

我是新来的发电机和koa所以我假设我在这里犯了一个愚蠢的错误。

koa-request或其他任何返回asynchronous调用的thunk或promise / thenable的库都被用来与协同例程库(如cokoa web应用程序框架)一起使用,它使用co来处理基于生成器的控制stream。

ECMAScript 6生成器不支持asynchronous,但ECMAScript 7将有asynchronous并等待处理这个本地。

该声明

 var response1 = beatsGen.next().value; 

返回由beats中的第一个yield语句返回的值,这是request(options)返回的thunk。 协同例程感知库将检查generator.next().value的返回值,并等待callback执行, then通过调用generator.next()来恢复生成器主体之前parsing。

这样的图书馆是:

 var request = require('koa-request'), co = require('co'); function beats (){ //doesn't have to be a generator function var options = { url: 'https://api.github.com/repos/dionoid/koa-request', headers: { 'User-Agent': 'request' } }; return request(options); //return the thunk } co(function *() { var response1 = yield beats; //use response }) 

如果这是为了与koa一起使用:

 app.use(function *() { this.body = yield beats(); }); 

顺便说一下, koa-request会更好地命名为co-request因为所有的协同程序包装都以co-为前缀。