Что такое безопасный и масштабируемый способ полного выбора всех пользователей из Amazon Cognito API в JavaScript?

Вам не будет разрешено создавать два компонента для вашего класса ресурсов. Вы можете достичь того, чего вы пытаетесь достичь, используя один класс ресурсов.

Вот пример:

@Path("rest")
public class SampleResourceClass {

  @Path("/public/pings")
  @GET
  public Responce getPings(){
    /* Code Here */
  }

  @Path("/private/accounts")
  @GET
  public Response getAccounts(){
    /* Code Here */
  }
}
1
задан joshikashi 15 January 2019 в 17:44
поделиться

1 ответ

Я понимаю, что рекурсия настолько опасна, что я не знаю, может ли эта техника вызвать проблемы, когда количество обещаний / вызовов увеличивается. На ум приходят вопросы о накладных расходах и управлении памятью

Рекурсивные подходы к вызовам с обещаниями, подобным вашему 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;
//           ^^^^^^^^
    }
  });
}

Promise.all дождался выполнения обоих обещаний

Нет, Вы передавали массив только с одним обещанием Promise.all и вызывали вторую функцию после завершения первой. Чтобы запустить одновременно, он должен выглядеть как

return Promise.all([
  CognitoIdentityServiceProvider.listUsersInGroupAsync(adminParams),
  getUserList()
]).then(([{ Users: adminUsers }, allUsers]) => {
  …
});
0
ответ дан Bergi 15 January 2019 в 17:44
поделиться
Другие вопросы по тегам:

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