Выполнить обещание в синхронных партиях javascript - PullRequest
3 голосов
/ 26 апреля 2020

У меня есть функция обещания, которая получает строку из массива строк на удаленный сервер.

const post = (row) => new Promise(resolve=>
    {    //do post then,
         resolve(response.data);
    }

Итак, я хочу создать функцию, которая выполняет итерацию по массиву и выполняет post для каждого элемента в партиях постоянного размера. Перед выполнением следующей партии текущая партия должна быть полностью обработана. Как мне этого добиться?

1 Ответ

3 голосов
/ 26 апреля 2020

можно использовать Promise.all для партии и await для разрешения:

const post = (row) => new Promise(resolve => {
    setTimeout(
        () => resolve(row.id), //for demo purpose
        1000);
})

const rows = [{
    id: 1
}, {
    id: 2
}, {
    id: 3
}, {
    id: 4
}, {
    id: 5
}, {
    id: 6
}, {
    id: 7
}];

const execute = async (batchSize) => {
    let currentPtr = 0;
    while (currentPtr < rows.length) {
        const results = await Promise.all(
            rows.slice(currentPtr, currentPtr + batchSize)
            .map(row => post(row))
        )
        console.log(results);
        currentPtr += batchSize;
    }
}

execute(2);
...