23. 例
? 同期版
function toUpperCaseFile(path) {
try {
var stats = fs.statSync(path);
if (!stats.isFile()) throw new Error(path + ' is not a file');
var data = fs.readFileSync(path, 'utf8');
fs.writeFileSync(path, data.toUpperCase());
console.log('completed');
} catch (err) {
console.error(err);
}
}
24. 例
? 非同期版
function toUpperCaseFile(path) {
fs.stat(path, function(err, stats) {
if (err) return console.error(err);
if (!stats.isFile()) return console.error(path + ' is not a file');
fs.readFile(path, 'utf8', function(err, data) {
if (err) return console.error(err);
fs.writeFile(path, data.toUpperCase(), function(err) {
if (err) return console.error(err);
console.log('completed');
});
});
});
}
25. インラインの無名関数をやめる
function toUpperCaseFile(path) {
fs.stat(path, readFile);
function readFile(err, stats) {
if (err) return console.error(err);
if (!stats.isFile()) return console.error(path + ' is not a file');
fs.readFile(path, 'utf8', writeFile);
}
function writeFile(err, data) {
if (err) return console.error(err);
fs.writeFile(path, data.toUpperCase(), complete);
}
function complete(err) {
if (err) return console.error(err);
console.log('completed');
}
}
32. フロー制御モジュールのイメージ
chain(function(next) {
fs.stat(path, next);
}, function(err, stats, next) {
if (err) return console.error(err);
if (!stats.isFile()) return console.error(path + ' is not a file');
fs.readFile(path, 'utf8', next);
}, function(err, data, next) {
if (err) return console.error(err);
fs.writeFile(path, data.toUpperCase(), next);
}, function(err) {
if (err) return console.error(err);
console.log('completed');
});
33. フロー制御モジュールの実装
function chain() {
var actors = Array.prototype.slice.call(arguments);
next();
function next() {
var actor = actors.shift();
var args = Array.prototype.slice.call(arguments);
if (actors.length > 0) { //最後のアクターにはnextを渡さない
args = args.concat(next);
}
actor.apply(null, args);
}
}
35. これや
function toUpperCaseFile(path) {
fs.stat(path, function(err, stats) {
if (err) return console.error(err);
if (!stats.isFile()) return console.error(path + ' is not a file');
fs.readFile(path, 'utf8', function(err, data) {
if (err) return console.error(err);
fs.writeFile(path, data.toUpperCase(), function(err) {
if (err) return console.error(err);
console.log('completed');
});
});
});
}
36. これが
function toUpperCaseFile(path) {
fs.stat(path, readFile);
function readFile(err, stats) {
if (err) return console.error(err);
if (!stats.isFile()) return console.error(path + ' is not a file');
fs.readFile(path, 'utf8', writeFile);
}
function writeFile(err, data) {
if (err) return console.error(err);
fs.writeFile(path, data.toUpperCase(), complete);
}
function complete(err) {
if (err) return console.error(err);
console.log('completed');
}
}
37. こうなった
chain(function(next) {
fs.stat(path, next);
}, function(err, stats, next) {
if (err) return console.error(err);
if (!stats.isFile()) return console.error(path + ' is not a file');
fs.readFile(path, 'utf8', next);
}, function(err, data, next) {
if (err) return console.error(err);
fs.writeFile(path, data.toUpperCase(), next);
}, function(err) {
if (err) return console.error(err);
console.log('completed');
});