可以'我找不到关于koa.js研讨会解决方案的解释,练习一

Can't find an explanation for koa.js workshop solution, exercise number one

本文关键字:解决方案 研讨会 解释 练习 js koa 找不到 可以      更新时间:2024-05-20

它必须相当简单,但我无法理解koa研讨会开始练习的解决方案。

测试:

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中找不到任何关于回调注入的信息。这是怎么回事?提前谢谢。

我在主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);
}

好吧,让我们回到解决方案上来。co的数字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,该函数获取filename值,并将其封装为返回的promise对象,这是co中支持的yieldables之一。此承诺通过回调启动fs.stat。如果一切正常,这个回调resolve是promise,否则reject是promise。resolved的结果返回到生成器中。