Команда ReQL: eachAsync
Синтаксис команды
sequence.eachAsync(function[, errorFunction]) → promise
Описание
Лениво итерирует по курсору, массиву или потоку по одному элементу за раз. eachAsync всегда возвращает промис, который будет разрешен, как только будут возвращены все строки.
Первая, обязательная функция, переданная в eachAsync, принимает в качестве аргументов одну или две функции. Первая — обратный вызов для обработки каждой строки по мере её получения; вторая — необязательный обратный вызов, который будет выполнен после завершения обработки всех строк.
function(rowProcess[, final])
Обратный вызов rowProcess получает строку в качестве первого аргумента; он также может принять необязательный второй аргумент, который является функцией обратного вызова, которая будет выполнена после обработки каждой строки.
function(row[, rowFinished])
Если вы принимаете обратный вызов rowFinished, он обязательно должен вызываться в конце каждой строки. Если вы вызываете rowFinished с любым значением, итерация остановится, а значение будет обернуто в error.message для обработчика ошибок.
Если вы не используете rowFinished, обратный вызов rowProcess может завершить итерацию досрочно, вернув любое значение кроме промиса. Если он возвращает значение, отличное от промиса (кроме undefined), то final получит объект ошибки. Если он возвращает промис, промис будет разрешён перед продолжением итерации; если разрешённый промис возвращает значение, итерация будет остановлена, и объект ошибки будет передан в final.
Если вы предоставите обратный вызов final, он всегда будет выполнен по завершении обработки строк (достижение конца последовательности, преждевременная остановка итерации или возникновение ошибки). Обратный вызов final получит объект error, если произошла ошибка или rowProcess вернуло любое значение (кроме промиса). Если final вернёт любое значение, оно будет проигнорировано.
Вкратце, всё вышесказанное на коде:
// process each row asynchronously
cursor.eachAsync(function (row) {
doSomethingWith(row);
});
// as above, but using rowFinished callback
cursor.eachAsync(function (row, rowFinished) {
doSomethingWith(row);
rowFinished();
});
// as above, but using final callback
cursor.eachAsync(function (row, rowFinished) {
doSomethingWith(row);
rowFinished();
}, function (final) {
// the 'final' argument will only be defined when there is an error
console.log('Final called with:', final);
});
Пример: Обработать все элементы в потоке, используя then и catch для обработки конца потока и любых ошибок. Обратите внимание, что итерация может быть остановлена в первом обратном вызове (rowProcess) путём возвращения любого значения, отличного от промиса.
cursor.eachAsync(function (row) {
var ok = processRowData(row);
if (!ok) {
throw new Error('Bad row: ' + row);
}
}).then(function () {
console.log('done processing');
}).catch(function (error) {
console.log('Error:', error.message);
});
Пример: Как выше, но с использованием обратных вызовов rowFinished и final вместо промиса, возвращаемого eachAsync.
cursor.eachAsync(
function (row, rowFinished) {
var ok = processRowData(row);
if (ok) {
rowFinished();
} else {
rowFinished('Bad row: ' + row);
}
},
function (error) {
if (error) {
console.log('Error:', error.message);
} else {
console.log('done processing');
}
}
);
Примечание: Вам нужно вручную закрыть курсор, если вы преждевременно остановите итерацию.
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/javascript/each_async/