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

时间:2015-02-15 00:51:10

标签: node.js generator ecmascript-6 koa

基本上我试图用我的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);
}

当我控制日志响应时,这就是我得到的

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

我认为response1是someType的对象,包含回调的body参数而不是函数本身。那么为什么我将函数作为生成器.next()。value?

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

1 个答案:

答案 0 :(得分:3)

koa-request或任何其他为异步调用返回thunks或promises / thenables的库,应该与像cokoa Web应用程序框架这样的协同例程库一起使用,它使用co来处理基于生成器的控制流。

ECMAScript 6生成器不是异步感知的,但ECMAScript 7将async and await本地处理它。

声明

var response1 = beatsGen.next().value;

返回beats中第一个 yield 语句返回的值,这是request(options)返回的thunk。一个共同例程感知的库将检查来自generator.next().value的返回值,并等待执行回调或then ables解决,然后再次调用generator.next()恢复生成器主体。

这样的库是co

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();
});

BTW,koa-request会更好地命名为co-request,因为所有协同例程包装都以co-为前缀。