На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> async.waterfall , Непонятки
    Немогу понять как переделать пример с классического Node на async.waterfall :wall:

    Классика:
    ExpandedWrap disabled
      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
    ExpandedWrap disabled
      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);
              });
          });
      });

    но тут файл всегда переписывается! Т.е. в принципе можно условие не указывать, но мне надо сделать по условию! Вопрос как? :wacko:

    Пример простой, async.waterfall тут не упрощает код, а даже усложняет, но для более длинных цепочек он очень даже может упростить. Короче не суть.
    Сообщение отредактировано: Cfon -
      Оказалось все просто :D
      Надо передать условие в качестве параметра и в следущей функции проверять его:
      ExpandedWrap disabled
        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);
                });
            });
        });

      Строгая типизация Делфи очень сильно меня загнало под стол! :lool:
      Потребовалось время чтобы снова начать гибко мыслить :D

      По идее можно разбить функцию проверки на две маленькие и еще более упростить код
      ExpandedWrap disabled
        ...
               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);
                });
        ...

      Можно еще обьединить параметры в обьект:
      ExpandedWrap disabled
        ...
               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);
                });
        ...
      Сообщение отредактировано: Cfon -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0253 ]   [ 15 queries used ]   [ Generated: 28.03.24, 20:46 GMT ]