javascript - 大神们看看这段代码,最后的注释里有我的疑问。
阿神
阿神 2017-04-10 15:57:05
[JavaScript讨论组]
var fs = require('fs');

var helper = function(fn) {
        return function() {
                var args = [].slice.call(arguments);
                var pass;
                args.push(function() {
                        if (pass) {
                                pass.apply(null, arguments);
                        }
                });

                fn.apply(null, args);

                return function(fn) {
                        pass = fn;
                }
        }
}

var readFile = helper(fs.readFile);

var flow = function*() {
        var txt = yield readFile('a.txt', 'utf8');
        console.log('txt : ', txt);
}

var g = flow();
var ret = g.next();
ret.value(function(err, data) {
        if (err) {
                throw err;
        } else {
                g.next(data);
                //这里返回txt的值,但是ret.value里的回调函数怎么保证及时传到readFile()里面的,fn.apply()执行时callback是function(pass){if(pass){}},而pass的值是在后面的ret.value()执行时才传递的?
        }
});
阿神
阿神

闭关修行中......

全部回复(1)
巴扎黑

1)

readFile('a.txt', 'utf8')

返回一个函数,这个函数接收一个函数为输入参数

var flow = function*() {
        var txt = yield readFile('a.txt', 'utf8');
        console.log('txt : ', txt);
}

flow是一个generator函数(function* 还带有yield),所以

g.next();

函数执行后返回一个函数,也就是ret.value是一个函数

ret.value(function *readFileCallBack*(err, data) {});

执行后就相当helper的闭包函数中的pass参数得到了一个readFileCallBack这个函数

2) fs.readFile请求调用后,会在下一次的时间循环中,会检查指定的文件是否有内容被读到,如果读取到或读取失败就会调用指定的回调。
也就是文件读取到内容后的回调的执行和当前代码不是在同一个时间序列中

args.push(function() {
                        if (pass) {
                                pass.apply(null, arguments);
                        }
                });

以上代码以及为fs.readFile添加了一个回调,如果pass不为空,pass函数会再调用apply方法,将传给回调函数的err,data参数传入pass

3)

g.next(data);

恢复generator函数的执行
就是执行

var txt=data;
console.log('txt : ', txt);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号