为什么这个生成器返回一个函数而不是一个值
基本上,我试图做我的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的库都被用来与协同例程库(如co
或koa
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-
为前缀。