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

标签 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);
}

当我控制台日志response1时,这就是我得到的

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

我认为response1将是某种类型的对象,其中包含回调的主体参数而不是函数本身。那么为什么我得到的函数是生成器 .next().value 呢?

我对生成器和 koa 很陌生,所以我假设我在这里犯了一个愚蠢的错误。

最佳答案

koa-request 或任何其他为异步调用返回 thunk 或 Promise/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能够在恢复生成器之前解析再次调用 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();
});

顺便说一句,koa-request 最好命名为 co-request,因为所有协同例程包装器都以 co- 为前缀。

关于node.js - 为什么这个生成器返回一个函数而不是一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521963/

相关文章:

javascript - 如何将数据从子组件(子组件有自己的状态)传递给父组件?

javascript - 使用键的字符串更新 setState

node.js - 如何让spectacle-code-slide 在 Windows 上运行?

node.js - extraHeaders 在 socket.io-client 中不起作用

python - 如何让生成器/迭代器在耗尽时评估为 False?

Python 笛卡尔幂发生器在幂列表上

node.js - 使用 get 函数从 Solidity 结构接收 JSON [Express]

node.js - 如何在 Jade 中反向迭代 for 循环?

node.js - 如何仅获取虚拟属性。 Node.JS + Mongoose + MongoDB

python - 我的 Python 函数中有一个生成器;如何返回修改后的列表?