2017-01-16 5 views
0

У меня есть этот кусок кода:Создать куски кода (функции, переменные) из массива (forEach)?

foo.bar('run', function() {  
    var text1 = foo.url('./src/url/text1.txt') 
      .go(bar.do({ something })) 
      .also(bar({ 
       variable: 1, 
       else: 2, 
      }).on('exception', doSomething)) 
      .also(bar.url('.src/url/source')) 

    var textLong = foo.url('./src/url/textLong.txt') 
      .go(bar.do({ something })) 
      .also(bar({ 
       variable: 1, 
       else: 2, 
      }).on('exception', doSomething)) 
      .also(bar.url('.src/url/source')) 

    var text = foo.url('./src/url/text.txt') 
      .go(bar.do({ something })) 
      .also(bar({ 
       variable: 1, 
       else: 2, 
      }).on('exception', doSomething)) 
      .also(bar.url('.src/url/source')) 

    return myCustomFunction(text1, textLong, text); 
} 

Как вы можете видеть это как анти-DRY, насколько это возможно, каждая переменная является тем же самым исключая имя переменной и имя файла (foo.url).

Я интересно, если это возможно, чтобы сделать его проще, что-то вроде:

var files = [ 'text1', 'textLong', 'text']; 

И потом:

foo.bar('run', function() {  
    files.forEach(function(fileName){ 
     var fileName = foo.url('./src/url/'+ fileName + '.txt') 
     .go(bar.do({ something })) 
     .also(bar({ 
      variable: 1, 
      else: 2, 
     }).on('exception', doSomething)) 
     .also(bar.url('.src/url/source')) 
    }) 

    return myCustomFunction(text1, textLong, text); 
}) 

Но лучшее, что я мог бы получить с моей второй подход text1 is not defined. Есть несколько вопросов относительно SO относительно динамического создания переменных, но они обычно имеют одинаковые имена +, я никогда не видел их в сочетании с пользовательскими функциями.

Любые подсказки?

ответ

2

Я обновил этот ответ с помощью советов от Атеса Горы, Томаса, Берги.

Используя некоторые функции, реализованные в ES2016 решение может выглядеть следующим образом:

foo.bar('run', function() { 

    return myCustomFunction(

    ...[ 'text1', 'textLong', 'text' ].map(fileName => { 

     return foo.url(`./src/url/${fileName}.txt`) 
     .go(bar.do({ something })) 
     .also(bar({ 
      variable: 1, 
      else: 2, 
     }) 
     .on('exception', doSomething)) 
     .also(bar.url('.src/url/source')); 

    }); 

); 

}); 
+1

Или даже: '\' ./src/url/$ {имя_файла} .txt \ '' –

+2

Также используйте 'const' вместо' let' для константы массив строк выше. –

+2

это должно быть 'return myCustomFunction (... resultOfFilesMap);' not '... files' – Thomas

1

Никогда не используйте динамические переменные. Вы хотите использовать массив вместо:

foo.bar('run', function() {  
    var files = [ 'text1', 'textLong', 'text']; 
    var texts = files.map(function(fileName) { 
//     ^^^ get back the results 
     return foo.url('./src/url/'+ fileName + '.txt') 
//  ^^^^^^ don't assign to anything 
     .go(bar.do({ something })) 
     .also(bar({ 
      variable: 1, 
      else: 2, 
     }).on('exception', doSomething)) 
     .also(bar.url('.src/url/source')) 
    }) 

    return myCustomFunction(texts[0], texts[1], texts[2]); 
}) 
+0

Это, кажется, работает нормально, но почему-то она нарушает порядок загрузки этих файлов, пожалуйста, см Coment под @Ates Góral ответ. Спасибо за отличный ответ! – Wordpressor

+0

Что значит «имеет некоторые зависимости»? В коде ничего нет. Мой ответ делает то же самое, что и ваш исходный код; конечно, оба могут включать некоторые условия гонки. – Bergi

2

Вы можете использовать .map() собирают результаты выполнения операции над элементами в массиве, а затем .apply() для вызова функции, используя массив потенциальных аргументов:

foo.bar('run', function() {  
    var results = files.map(function(fileName){ 
    return foo.url('./src/url/'+ fileName + '.txt') 
     .go(bar.do({ something })) 
     .also(bar({ 
     variable: 1, 
     else: 2, 
     }) 
     .on('exception', doSomething)) 
     .also(bar.url('.src/url/source')); 
    }); 

    return myCustomFunction.apply(null, results); 
}); 
+0

Будет ли ваше решение каким-то образом изменять порядок моих файлов? Поскольку, похоже, работает, но textLong.txt имеет некоторые зависимости в text1.txt, и теперь я получаю ошибки «неопределенной переменной» :((Я использовал foo/bar/txt в качестве фиктивного примера, m, используя Gulp с файлами CoffeeScript здесь). – Wordpressor

+0

Нет, '.map()' сохраняет порядок. –

+0

Я объединяю потоки (myCustomFunction - это «merge» IRL): https://www.npmjs.com/ package/gulp-merge – Wordpressor