1

本质上,我正在尝试使用我的 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 呢?

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

4

1 回答 1

3

koa-request或任何其他为异步调用返回 thunk 或 Promise/thenables 的库旨在与协程库(如用于处理基于生成器的控制流)cokoaWeb 应用程序框架一起使用。co

ECMAScript 6 生成器不支持异步,但 ECMAScript 7 将具有async 和 await以本机处理此问题。

该声明

var response1 = beatsGen.next().value;

返回beats 中第一个yield语句返回的值,即request(options). 协同程序感知库将检查返回值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-.

于 2015-02-15T05:27:54.630 回答