Я пытаюсь понять функцию async each(coll, iteratee, callback)
для выполнения функции параллельно для каждого элемента массива. Из асинхронных документов я понимаю, что обратный вызов будет выполняться только один раз (когда будет выполняться функция iteratee для каждого элемента массива).Async каждая функция
И в случае ошибки в функции итерации вызов callback('some error message')
немедленно вызовет функцию обратного вызова с сообщением об ошибке.
Ниже приведен пример из асинхронных документаций для каждой функции
каждого (Coll, iteratee, обратный вызов)
// assuming openFiles is an array of file names
async.each(openFiles, function(file, callback) {
// Perform operation on file here.
console.log('Processing file ' + file);
if(file.length > 32) {
console.log('This file name is too long');
callback('File name too long');
} else {
// Do work to process file here
console.log('File processed');
callback();
}
}, function(err) {
// if any of the file processing produced an error, err would equal that error
if(err) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('A file failed to process');
} else {
console.log('All files have been processed successfully');
}
});
То, что я не в состоянии понять, что такой же вызов обратного вызова() без аргументов, мне очень странно, что мы вызываем callback() без аргумента, когда в функции iterate нет ошибки. Что вызывает звонок callback() or callback(null)
в случае отсутствия ошибок.
Не можем ли мы просто удалить те callback() or callback(null)
, когда мы на самом деле хотим вызвать обратный вызов только один раз (когда функция итерации выполняется для всех элементов массива), а не для каждого элемента массива.
Спасибо @hargasinski, у меня есть одна путаница, когда мы вызываем callback(), когда нет ошибки в функции iteratee, похоже, что мы фактически выполняем функцию обратного вызова (третий аргумент async.each) для каждого элемента –
Да , Я вижу, как это может сбивать с толку. Вы можете переименовать аргументы как 'function (err, fileCallback)', а затем вызвать 'fileCallback();' или 'fileCallback ('File name too long')', чтобы сделать его немного понятным. В этом примере переменные имеют одно и то же имя, но представляют разные вещи. – hargasinski
Спасибо, приятель, теперь я понял. –