0

它必须相当简单,但我无法理解koa 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);
}

然后,我只有一个问题:为什么匿名函数fs.stat()会在同一个地方返回,它在哪里需要done回调?我已经记录了这个回调,它是next()带有对象作为传递参数的生成器方法stats,但是我找不到任何关于回调注入的信息co。这是如何运作的?先感谢您。

4

1 回答 1

0

我无法在 main 上找到此信息README.md,但它似乎自动co提供了对thunk的回调。所以在上面的例子中co提供了done回调并调用:

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

如果有错误,这个回调期望主函数会返回错误(done(err);),如果一切正常:done(null, result);。之后将结果传递给生成器。这是done回调代码:

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

好吧,让我们回到解决方案。的cogitREADME.md说:

Thunk 支持仅保留用于向后兼容,可能会在未来版本的co.

所以让我们用 Promise 将其重写为现代视图:

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

我们用匿名函数包装 promise,该函数获取filename值并将其封装为返回的 promise 对象,co. 这个承诺从fs.stat回调开始。如果一切正常,这个回调resolve就是 promise,reject否则就是。d结果resolve返回到生成器。

于 2016-04-18T10:16:39.573 回答