Перейти к содержимому

Циклы

Итерация по данным и циклическая обработка в n8n

По умолчанию n8n автоматически обрабатывает каждый item:

Нода выполнится 3 раза — по одному для каждого item.

Явный цикл с контролем итерации.

  • Обработка с паузами (rate limiting)
  • Batch processing
  • Условная остановка цикла
  • Отслеживание прогресса
ПараметрОписание
Batch SizeItems за одну итерацию
OptionsReset, Pause
  1. Loop Over Items: Batch Size = 1
  2. HTTP Request: API вызов
  3. Wait: 1 секунда
  4. Done: Подключить выход “done”

Разбиение на пакеты для параллельной обработки.

ПараметрОписание
Batch SizeРазмер пакета
// В Code после Split In Batches
const batch = $input.all();
// Обработка пакета
const results = await Promise.all(
batch.map(item => processItem(item))
);
return results;

Вызов workflow из самого себя для обработки иерархий.

// Входные данные
{
"id": 1,
"children": [
{ "id": 2, "children": [] },
{ "id": 3, "children": [
{ "id": 4, "children": [] }
]}
]
}

Workflow:

  1. Получить текущий узел
  2. Обработать узел
  3. Для каждого child вызвать этот же workflow
  4. Собрать результаты

Цикл с условием выхода:

// В Code ноде внутри цикла
const currentItem = $input.first();
const shouldContinue = currentItem.json.hasMore;
if (!shouldContinue) {
// Завершить цикл
return [];
}
// Продолжить
return [currentItem];

Получение данных постранично.

HTTP Request поддерживает автоматическую пагинацию:

ПараметрЗначение
Pagination ModeUpdate a Parameter Each Request
Parameterpage
Start Value1
Update+1
// В Code ноде
const response = $input.first().json;
const currentPage = $('Set Page').first().json.page;
if (response.hasNextPage) {
return [{
json: {
page: currentPage + 1,
data: response.data
}
}];
}
// Пагинация завершена
return [{ json: { done: true, allData: response.data }}];
// ❌ Медленно
items.forEach(async item => {
await apiCall(item);
});
// ✅ Быстро
await apiCall(items); // Если API поддерживает batch

Используйте Split In Batches с оптимальным размером:

  • Маленькие batches: меньше памяти, больше overhead
  • Большие batches: больше памяти, меньше overhead
  • Оптимум: 50-100 items при batch API
// В Code ноде
const CONCURRENT_LIMIT = 5;
const items = $input.all();
const results = [];
for (let i = 0; i < items.length; i += CONCURRENT_LIMIT) {
const batch = items.slice(i, i + CONCURRENT_LIMIT);
const batchResults = await Promise.all(
batch.map(item => processItem(item))
);
results.push(...batchResults);
}
return results.map(r => ({ json: r }));
const maxRetries = 3;
let attempt = $input.first().json.attempt || 0;
try {
const result = await riskyOperation();
return [{ json: result }];
} catch (error) {
if (attempt < maxRetries) {
// Продолжить цикл с увеличенным attempt
return [{
json: {
attempt: attempt + 1,
waitTime: Math.pow(2, attempt) * 1000
}
}];
}
throw error;
}
const response = $input.first().json;
const cursor = response.nextCursor;
if (cursor) {
return [{
json: {
cursor,
accumulatedData: [
...($json.accumulatedData || []),
...response.data
]
}
}];
}
// Все данные получены
return [{
json: {
data: [...($json.accumulatedData || []), ...response.data]
}
}];