2016-04-12 1 views
0

Это должно быть довольно просто, но я не могу понять решение для the beginning exercise from koa workshop.Не можете найти объяснение для решения koa.js workshop, упражнение номер один

Тест:

var co = require('co'); 
var assert = require('assert'); 
var fs = require('./index.js'); 

describe('.stats()', function() { 
    it('should stat this file', co(function*() { 
    var stats = yield fs.stat(__filename); 
    assert.ok(stats.size); 
    })); 
}); 

Решения и задачи:

var fs = require('fs'); 

/** 
* Create a yieldable version of `fs.stat()`: 
* 
* app.use(function*() { 
*  var stats = yield exports.stat(__filename); 
* }) 
* 
* Hint: you can return a yieldable. 
*/ 

exports.stat = function (filename) { 
    return function (done) { 
     fs.stat(filename, done); 
    } 
}; 

Я так думаю, что из этого теста: co библиотеки выполняет функцию генератора для нас, fs.stat(__filename) вызывающих, возвращается

function (done) { 
    fs.stat(filename, done); 
} 

Тогда у меня есть вопросы: почему d oes анонимная функция возвращает fs.stat() в том же месте и где требуется done callback? Я зарегистрировал этот обратный вызов, это генераторы next() с объектом stats как передающий параметр, но я не могу найти информацию о вводе обратных вызовов в co. Как это работает? Заранее спасибо.

ответ

0

Я не смог найти эту информацию на главной README.md, но это выглядит как co обеспечивает обратный вызов санков автоматически. Таким образом, в приведенном выше примере co обеспечивает done обратный вызов и вызывает:

function (done) { 
    fs.stat(filename, done); 
} 

Если есть ошибка этот обратный вызов ожидает, что основная функция будет возвращать ошибку (done(err);), если все в порядке: done(null, result);. После этого результат передается генератору. Вот код done обратного вызова:

function() { 
    if (called) return; 
    called = true; 
    next.apply(ctx, arguments); 
} 

Ну, давайте вернемся к решению. co «s мерзавца README.md говорит:

поддержка Thunk остается только для обратной совместимости и может быть удалена в будущих версиях co.

Так давайте перепишем его на современный взгляд с обещаниями:

exports.stat = function(filename) { 
    return new Promise((resolve, reject) => { 
    fs.stat(filename, (err, stats) => { 
     if (err) {reject(err);} 
     resolve(stats); 
    }); 
    }); 
}; 

Мы обертывают обещание с анонимной функции, которые получают значение filename и инкапсулирует его для возвращения объекта обещание, которое является одним из поддерживаемый доходность в co. Это обещание начинается с fs.stat с обратным вызовом. Этот обратный вызов resolve s обещание, если все в порядке, или reject s иначе. Результат resolve d возвращается в генератор.

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