У меня есть такой массив:
var subscriptions = ['sub_1234', 'sub_5678', 'sub_8493'];
В моем реальном приложении массив обычно имеет около 800 идентификаторов подписок.
В настоящее время у меня есть такой цикл:
var subscriptionData = [];
for(var i in subscriptions) {
subscriptionID = subscriptions[i];
var data = await stripe.subscriptions.retrieve(subscriptionID);
subscriptionData.push(data);
}
Цель цикла - экстраполировать идентификаторы подписки, чтобы узнать всю информацию, относящуюся к этому идентификатору (суммы платежей, счета-фактуры и т. д.).
Проблема в том, что с 600 подписками на просмотр всех этих данных может уйти 20-30 минут.
Есть ли возможность запустить цикл for параллельно, чтобы он одновременно извлекал все подписки на полосы и помещал данные в массив? Тогда продолжается?
Смотрел вот эту библиотеку: https://github.com/caolan/async
Но я не мог понять, как это сделать, если вы не знаете, какой длины массив (массив может быть переменной длины).
@Derek Я думал об этом, но не мог понять, как это сделать в Stripe, он позволяет получать информацию только об одной подписке за раз.
Вы можете получить 10 или 20 подписок одновременно и await для них с помощью Promise.all
Есть разница между асинхронным и параллельным. Чтобы запустить что-либо параллельно с Node, вам нужно использовать дочерние процессы. Однако вы можете использовать Promise.all для запуска одновременных вызовов API, таких как fxgx, если это то, что вам нужно.
@ dpopp07 Можете ли вы предоставить примеры, используя массив, как в примере? Я не могу найти никаких примеров Promise.all () с таким массивом.
@fxgx Можете ли вы предоставить какие-либо примеры итерации по всему массиву?
@Jordash, что опубликовал @capcap, правильно. Promise.all может иметь некоторые предостережения, о которых полезно знать, я рекомендую эта ветка, чтобы узнать о нем больше.





const subscriptions = ['sub_1234', 'sub_5678', 'sub_8493'];
async function customFunction(subscriptions) {
const getSubscription = subscriptions.map((item) => {
return stripe.subscriptions.retrieve(item);
});
const subscriptionData = await Promise.all(getSubscription);
return subscriptionData; // returns an array
};
// call the function and pass parameter value
customFunction(subscriptions);
Есть ли способ выполнить такой запрос кусками по 10 за раз? Я продолжаю получать ошибки, связанные с слишком большим количеством одновременных запросов.
Вы можете попробовать использовать parallelLimit caolan.github.io/async/v3/docs.html#parallelLimit
вам, вероятно, следует переосмыслить, как вы обрабатываете такое количество запросов. Возможно, вы захотите отправить запрос API 1 со всеми идентификаторами вместо одного за раз