【问题标题】:Can't find an explanation for koa.js workshop solution, exercise number one找不到 koa.js 研讨会解决方案的解释,练习一
【发布时间】:2016-04-12 11:01:38
【问题描述】:

它必须相当简单,但我无法理解the beginning exercise from 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 回调?我已经记录了这个回调,它是带有stats 对象作为传递参数的生成器next() 方法,但是我在co 中找不到有关回调注入的任何信息。这是如何运作的?提前谢谢你。

【问题讨论】:

    标签: javascript generator koa co


    【解决方案1】:

    我无法在主 README.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 的未来版本中删除。

    所以让我们用 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 中支持的 yieldables 之一。这个承诺以回调开始 fs.stat。如果一切正常,这个回调resolves 是承诺,否则是rejects。 resolved 结果返回到生成器中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-12
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多