利用Promise来构造generator自动运行器
利用Promise来构造generator自动运行器
by Yoghurts
JavaScript
/**
* @description 模拟读取文件
*/
console.log = function(str) {
var node = document.createElement("p");
node.innerHTML = str;
document.body.appendChild(node);
}
var file = {
'file1.txt': "file2.txt",
'file2.txt': 'Hello, Generator!'
};
function _readFile(filename, cb) {
setTimeout(function () {
cb(null, file[filename]);
}, 100)
}
function _sleep(ms, cb) {
setTimeout(function () {
cb(null, "已经睡眠" + ms + "ms, time is up!");
}, ms);
}
function _readFileSync(filename, cb) {
cb(null, file[filename]);
}
/**
* 重写thunkify函数,使其能兼容同步任务
*/
function thunkify(fn) {
return function () {
var args = [].slice.call(arguments);
var ctx = this;
return function (done) {
var called;
args.push(function () {
if (called)
return;
called = true;
done.apply(null, arguments);
})
try {
fn.apply(ctx, args);
// 将任务函数置后运行
} catch (ex) {
done(ex);
}
}
}
}
function toPromise(fn) {
return function () {
var thunkify_fn = thunkify(fn).apply(this, arguments);
return new Promise(function (resolve, reject) {
thunkify_fn(function (err, data) {
if (err)
reject(err);
resolve(data);
})
}
)
}
}
function run(generator) {
var gen = generator();
function next(data) {
var ret = gen.next(data);
if (ret.done)
return Promise.resolve("done");
return Promise.resolve(ret.value).then(data => next(data)).catch(ex => gen.throw(ex));
}
try {
return next();
} catch (ex) {
return Promise.reject(ex);
}
}
var readFile = toPromise(_readFileSync);
var sleep = toPromise(_sleep);
function* flow() {
var file1 = yield readFile("file1.txt");
console.log('file1的内容是:...