Я понимаю, что рекурсия настолько опасна, что я не знаю, может ли эта техника вызвать проблемы, когда количество обещаний / вызовов увеличивается. На ум приходят вопросы о накладных расходах и управлении памятью
blockquote>Рекурсивные подходы к вызовам с обещаниями, подобным вашему
getUserList
, в порядке .Единственная возможная проблема с памятью заключается в том, что ваш
allUsersTemp
массив может расти очень большим, пока он не превысит пределы вашего браузера. Однако задолго до этого вы должны задаться вопросом: будет ли полезно отображать сотые тысячи записей пользователей в одной большой таблице? В тех масштабах, когда память станет проблематичной, вам понадобятся более эффективные инструменты для управления вашей пользовательской базой, чем просто перечисление всех из них.Что касается стиля кода, я бы рекомендовал не объявлять
allUsersTemp
иpaginationToken
как изменяемые переменные более высокого уровня. Вместо этого задайте им параметры вашей рекурсивной функции и выполните обещание с результатом:function getUserList (paginationToken, allUsersTemp = []) => { // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ return tempUserTest = CognitoIdentityServiceProvider.listUsersAsync({ UserPoolId: process.env.COGNITO_USER_POOL_ID, PaginationToken: paginationToken }).then(tempUser => { const allUsers = allUsersTemp.concat(tempUser.Users); const nextToken = tempUser.PaginationToken; if (nextToken) { return getUserList(nextToken, allUsers); // ^^^^^^^^^^^^^^^^^^^ } else { return allUsers; // ^^^^^^^^ } }); }
blockquote>
Promise.all
дождался выполнения обоих обещанийНет, Вы передавали массив только с одним обещанием
Promise.all
и вызывали вторую функцию после завершения первой. Чтобы запустить одновременно, он должен выглядеть какreturn Promise.all([ CognitoIdentityServiceProvider.listUsersInGroupAsync(adminParams), getUserList() ]).then(([{ Users: adminUsers }, allUsers]) => { … });
Просто присвойте локальной переменной:
@a = qw(foo bar baz);
map {my $ch = $_; scalar grep $_ =~ /^$ch/, @a} qw(a b c d e f)