Насколько я понимаю, вы хотите запускать их последовательно. Ваш текущий код с Promise.all
будет запускать их параллельно.
Если вы хотите запустить их последовательно, проще всего (поскольку вы используете Node.js) - использовать функцию async
и await
:
const MAXIMUM_POST_SIZE = 1000
export const addProducts = async (products) => {
for (let i = 0; i < Math.ceil(products.length / MAXIMUM_POST_SIZE); i += 1) {
const indexToStartExtraction = i * MAXIMUM_POST_SIZE;
const sizeOfExtraction = indexToStartExtraction + MAXIMUM_POST_SIZE;
const extractedProducts = products.slice(indexToStartExtraction, sizeOfExtraction);
const ref = firebase.ref('products');
const normalizedPostData = arrayToJsonObjectWithUid({ products: extractedProducts, ref });
console.log(extractedProducts.length);
console.log(`Doing ${i} call`);
await ref.update(normalizedPostData);
}
return true;
};
. Любая неопределенно последняя версия Node.js поддерживает функции async
.
Эта функция возвращает обещание, которое будет:
- Отклонить, если отклонен любой из вызовов
ref.update
, или - Выполнить со значением
true
, когда все они успешно завершили
Он ждет, пока каждый из них завершит sh, прежде чем начать следующий. Напротив, ваша версия с Promise.all
запускает все обновления, позволяет этим обновлениям запускаться одновременно, а затем ждет, пока они все не завершатся.
Обратите внимание, что все, что вызывает addProducts
, должно будет ждать своего обещания для расчета, если все, что приходит после того, как addProducts
вызов может выполняться одновременно с вызовами обновления, addProducts
запускается.