Javascript Can';为KOA.JS车间解决方案找到一个解释,第一个练习

Javascript Can';为KOA.JS车间解决方案找到一个解释,第一个练习,javascript,generator,koa,co,Javascript,Generator,Koa,Co,它必须相当简单,但我无法理解的解决方案 测试: 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.

它必须相当简单,但我无法理解的解决方案

测试:

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(\uu filename)
调用,返回

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

然后,我所有的问题都是:为什么匿名函数在同一个位置返回
fs.stat()
,它在哪里进行
done
回调?我已经注销了这个回调,它是以
stats
对象作为传递参数的生成器
next()
方法,但是我在
co
中找不到任何有关回调注入的信息。这是怎么回事?提前谢谢。

我无法在主
自述文件.md
上找到此信息,但它看起来像是
co
自动提供了对thunks的回调。因此,在上面的示例中,
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
的git
README.md
说:

Thunk支持仅保留向后兼容性,并可能在未来版本的
co
中删除

因此,让我们用承诺将其改写为现代观点:

exports.stat = function(filename) {
  return new Promise((resolve, reject) => {
    fs.stat(filename, (err, stats) => {
      if (err) {reject(err);}
      resolve(stats);
    });
  });
};
我们使用匿名函数包装promise,该函数获取
文件名
值,并将其封装为返回的promise对象,该对象是
co
中支持的可扩展项之一。此承诺通过回调启动
fs.stat
。如果一切正常,则此回调
resolve
s承诺;否则,
reject
s承诺。
resolve
d结果返回到生成器中