2016-04-12 2 views
0

これはかなりシンプルでなければなりませんが、the beginning exercise from koa workshopの解を理解できません。koa.js workshop solution、exercise number oneの説明が見つかりません

テスト:

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)呼び出し、戻りthe

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

次に、私はすべて質問があります:なぜd oesの匿名関数は同じ場所にfs.stat()を返し、どこでdoneコールバックを受け取るのですか?私はこのコールバックをログに記録しました。生成元はstatsのオブジェクトを渡すパラメータとしてnext()メソッドですが、コールバックの注入に関する情報はcoにありません。これはどのように作動しますか?前もって感謝します。

答えて

0

私は、メインREADME.md上でこの情報を見つけることができませんでしたが、coサンク自動的にコールバックを提供しますように見えます。 co上記の例はdoneコールバックを提供し、呼び出し中のSO:done(null, result);:エラーが発生した場合

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

をこのコールバックは、すべてがOKであれば主な機能は、エラー(done(err);)を返すだろうと期待しています。その後、結果はジェネレータに渡されます。ここでdoneコールバックコードは次のとおりです。

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

さて、ソリューションに戻ってみましょう。 coのgitがREADME.md言う:

サンクのサポートは、後方互換性のためだけにとどまり、coの将来のバージョンで削除されることがあります。我々はの一つであるfilename値を取得して返す約束のオブジェクトのためにそれをカプセル化する無名関数、との約束を包む

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

それでは、約束して近代的なビューにそれを書き直してみましょうcoに記載しています。この約束は、コールバックでfs.statを開始します。このコールバックresolveは、すべてが正常であれば約束、それ以外の場合はrejectです。 resolveの結果はジェネレータに戻ります。

関連する問題