Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.6.194] |
|
Сообщ.
#1
,
|
|
|
Немогу понять как переделать пример с классического Node на async.waterfall
Классика: const async = require('async'); const fs = require('fs'); const path = require('path'); const dir = path.resolve('.', 'data'); fs.readdir(dir, (err, filenames) => { if (err) return console.log(err); filenames.forEach(fname => { var filepath = path.resolve(dir, fname); fs.readFile(filepath, 'utf8', (err, text) => { if (err) return console.log(err); if (text.search(/microsoft\.com/g) !== -1) { var t = text.replace(/microsoft\.com/g, 'mudosoft.com'); fs.writeFile(filepath, t, err => { if (err) return console.log(err); console.log('changed ' + fname); }); } }); }); }); тоже на async.waterfall fs.readdir(dir, (err, filenames) => { if (err) return console.log(err); filenames.forEach(fname => { var filepath = path.resolve(dir, fname); async.waterfall([ cb => fs.readFile(filepath, 'utf8', (err, text) => cb(err, text)), (text, cb) => { if (text.search(/microsoft\.com/g) !== -1) { var t = text.replace(/microsoft\.com/g, 'mudosoft.com'); cb(null, t); } else { cb(null, text); } }, (txt, cb) => fs.writeFile(filepath, txt, err => cb(err, 'changed ' + fname)) ], (err, results) => { if (err) return console.log(err); console.log(results); }); }); }); но тут файл всегда переписывается! Т.е. в принципе можно условие не указывать, но мне надо сделать по условию! Вопрос как? Пример простой, async.waterfall тут не упрощает код, а даже усложняет, но для более длинных цепочек он очень даже может упростить. Короче не суть. |
Сообщ.
#2
,
|
|
|
Оказалось все просто
Надо передать условие в качестве параметра и в следущей функции проверять его: fs.readdir(dir, (err, filenames) => { if (err) return console.log(err); filenames.forEach(fname => { var filepath = path.resolve(dir, fname); async.waterfall([ cb => fs.readFile(filepath, 'utf8', (err, text) => cb(err, text)), (text, cb) => { if (text.search(searchReg) !== -1) { cb(null, text.replace(searchReg, replaceText), true); // ^^^ cond } else { cb(null, text, false); // ^^^ cond } }, (text, cond, cb) => { if (!cond) return cb(null, 'unchanged ' + fname); fs.writeFile(filepath, text, err => cb(err, 'changed ' + fname)); }, ], (err, results) => { if (err) return console.log(err); console.log(results); }); }); }); Строгая типизация Делфи очень сильно меня загнало под стол! Потребовалось время чтобы снова начать гибко мыслить По идее можно разбить функцию проверки на две маленькие и еще более упростить код ... async.waterfall([ cb => fs.readFile(filepath, 'utf8', (err, text) => cb(err, text)), (text, cb) => cb(null, text.search(searchReg) !== -1, text), (cond, text, cb) => cb(null, cond, text.replace(searchReg, replaceText)), (text, cond, cb) => { if (!cond) return cb(null, 'unchanged ' + fname); fs.writeFile(filepath, text, err => cb(err, 'changed ' + fname)); }, ], (err, results) => { if (err) return console.log(err); console.log(results); }); ... Можно еще обьединить параметры в обьект: ... async.waterfall([ cb => fs.readFile(filepath, 'utf8', (err, text) => cb(err, text)), (text, cb) => cb(null, {isChanged: text.search(searchReg) !== -1, text}), (data, cb) => { data.text = data.text.replace(searchReg, replaceText); cb(null, data); }, (data, cb) => { if (!data.isChanged) return cb(null, 'unchanged ' + fname); fs.writeFile(filepath, data.text, err => cb(err, 'changed ' + fname)); } ], (err, results) => { if (err) return console.log(err); console.log(results); }); ... |