在生成器/ yield中包装fs.readFile

bal*_*ton 9 javascript yield generator node.js

我试图在JavaScript和Node.js中了解生成器和产量,但是遇到了问题.

理想情况下,我想要做的是用生成器/ yield包装fs.readFile,这样我就可以同步使用它而不会阻塞任何东西.

我想出了以下代码:

function readFileSync (path) {
    return (function *(){
        return yield require('fs').readFile(path, function *(err, data){
            yield data;
        });
    })();
}

console.log(readFileSync('test-file.txt'));
Run Code Online (Sandbox Code Playgroud)

但是,不幸的是,readFileSync只是总是返回{}而不是文件内容.

希望我想要实现的目标仍然是可能的,或者我可能完全错过了生成器/产量的点,我完全错误地使用它,在这种情况下指出我出错的地方,任何资源都会很棒.

lge*_*man 10

如何使用带有和声功能的节点启用(node --harmony)和这个超级简单的ES6片段:

function run( gen, iter) {
  (iter=gen( (err, data) => (err && iter.raise(err)) || iter.next(data))).next();
}

run(function* (resume) {
    var contents = yield require('fs').readFile(path, resume);
    console.log(contents);
});
Run Code Online (Sandbox Code Playgroud)

您可以在本文的orangevolt.blogspot.com上阅读有关此死亡简单模式的更多信息(并在线试用)


ale*_*lex -3

使用生成器将异步函数转变为同步函数是不可能的。

生成器可以中断自己,但不能中断其他函数的控制流。

因此,您的代码可以工作的唯一方法是它位于另一个生成器中:

console.log(yield* readFileSync('test-file.txt'));
Run Code Online (Sandbox Code Playgroud)