Задать вопрос
@reaget

Как обработать массив последовательно?

Здравствуйте!

Есть массив arr, который мы будем обрабатывать.
Как нам пробежаться по нему, обрабатывая следующий элемент только тогда, когда обработали первый.

Есть такой пример с аякс. Мы передаем функции первый элемент. После того, как аякс выполнился, мы запускаем функцию рекурсивно, передав дальше массив, без первого элемента и так далее. Если массив пуст. Мы завершаем выполнение.
var array = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];

function send(arr) {
                        if (arr.length == 0)
                            return;
                            
                        let a = arr.splice(0, 1)[0];
                        $.ajax({
                    		url: '/assets/themes/theme/send.php',
                    		method: 'post',
                    		data: {
                    			text: a,
                    		},
                    		success: function(data) {
                    		    setTimeout(function() {
                    		        console.log("Done: ", a);
                    		        send(arr);
                    		    }, 2000);
                    		}
                    	});
                    }
                    
                     send(array);


Я не считаю это лучшим решением. Тем более, если у нас будет не аякс, а к примеру тяжелое вычисление данных, то этот код уже не подходит.

Основная задача, чтобы наш цикл выполнялся последовательно. Второй элемент выполняется только после того, как первый завершил работу.
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Средний 6 комментариев
Пригласить эксперта
Ответы на вопрос 4
@DrWeyber
Сделать функцию, которая будет вызывать аякс с arr[i], и в зене вызывать эту же функцию с параметром arr[i+1], если он не false
Как-то так это вижу
Ответ написан
Комментировать
lazalu68
@lazalu68
Salmon
async function eatCookie(cookie) {
    // some asynchronous cookie eating
}

// or

function eatCookie(cookie) {
    // some cookie eating that returns a promise which should be resolved when eating is over
}

for (let cookie of cookies) {
    await eatCookie(cookie);
}
Ответ написан
Комментировать
@DimaIs
const array = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];

const processArray = async arrayToProcess => {
    for (let now = 0; now < arrayToProcess.length; now++) {
        const currentItem = arrayToProcess[now];
        await anyAsyncFunction(currentItem)
    }
}

const anyAsyncFunction = anyData => new Promise((resolve, reject) => {
    $.ajax({
        url: '/assets/themes/theme/send.php',
        method: 'post',
        data: {
            text: anyData,
        },
        success: resolve
    });
})
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
var array = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'];

array
// из каждого сделать функцию, возвращающую промис
.map((el) => () => new Promise((resolve, reject) => $.ajax({
  url: '/assets/themes/theme/send.php',
  method: 'post',
  data: {text: el},
  success: resolve,
  error: reject,
})))
// склеить цепочку
.reduce((acc, c) => acc.then(() => c()), Promise.resolve())
.catch(err => console.error(err));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы