2015-02-15 3 views
1

По существу я пытаюсь сделать запрос 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 бы SomeType объекта, содержащего параметр тела обратного вызова не сама функция. Итак, почему я получаю функцию как генераторы .next(). Value?

Я новичок в генераторах и koa, поэтому я предполагаю, что я делаю глупую ошибку здесь.

ответ

3

koa-request или любой другая библиотеки, которая возвращает санки или обещание/thenables для асинхронных вызовов предназначен для использования с сопрограммой библиотекой как co или структурой приложения koa веба, который использует co для обработки генератора на основе потока управления.

Генераторы ECMAScript 6 не являются асинхронными, но ECMAScript 7 будет иметь async and await для обработки этого изначально.

Оператор

var response1 = beatsGen.next().value; 

возвращает значение, возвращаемое первым оператором выход в ударах, который является преобразователь, возвращенный request(options). Библиотека, поддерживающая совместную программу, проверит возвращаемое значение с 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-.

+0

Спасибо человеку. На самом деле не понимал какой-то основной «магии», которая происходила. Просто из любопытства, как бы вы порекомендовали модульное тестирование в koa. Я не смог бы запустить промежуточное программное обеспечение app.use просто из вызова функции .exports, что я сделал с выражением в проходе. –

+1

Вы можете использовать [co-mocha] (https://github.com/blakeembrey/co-mocha) для тестирования генераторов. –

Смежные вопросы