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
的gitREADME.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结果返回到生成器中