Promise.all получает «Access-Control-Allow-Origin» только при использовании более 4 обещаний - PullRequest
0 голосов
/ 03 мая 2018

Как дела. Я нашел что-то странное, проблема. Я собираюсь получить случайную информацию для 20 человек из 'https://randomuser.me/api/' Поэтому я реализовал код следующим образом. тогда он покажет мне No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 503. ошибка.

    for (let i = 0; i < 20; i++) {
      const promise = this.http.get<any>('https://randomuser.me/api/').toPromise();
      promises.push(promise);
    }
    Promise.all(promises).then(function(values) {
      console.log(values);
    });

И что странно, если я получу данные до 4 человек, этого не произойдет. Так что следующий пример работает правильно.

    for (let i = 0; i < 4; i++) {
      const promise = this.http.get<any>('https://randomuser.me/api/').toPromise();
      promises.push(promise);
    }

Это очень странно, я пробовал с Rxjs, используя оператор forkjoin, но результат был тот же, он также позволял только 4 наблюдаемых. Пожалуйста, помогите мне. Спасибо.

1 Ответ

0 голосов
/ 03 мая 2018

Превращение моих комментариев в ответ:

Состояние ошибки 503, вероятно, указывает на то, что на сервере происходит что-то еще, что ложно сообщается как ошибка CORS. Возможно, вы слишком быстро делаете слишком много запросов к серверу, и по этой причине он сообщает об ошибке в запросе OPTIONS и, таким образом, он сообщается как ошибка CORS, но на самом деле это вызвано слишком быстрым выполнением запросов.

Общей причиной для кода состояния 503 является «услуга недоступна». Так что это также может быть вызвано некоторой инфраструктурой, которая защищает целевой сервер от слишком большого количества запросов.

Поскольку я не могу изменить API, как я могу получить информацию о 20 людях? Должен ли я использовать таймер? или рекурсивная функция? Оба они, кажется, не очень хорошее решение. Как я могу решить это на стороне интерфейса?

Прочитайте документацию по API или посетите форумы поддержки и выясните, какой тип ограничения скорости он реализует. Если вы не можете найти какие-либо документы или справочную информацию по этому вопросу, вам придется выяснить это путем тестирования, а затем ограничить частоту запросов, чтобы оставаться ниже этого уровня.


UPDATE

Из документа видно, что вы можете получить 20 пользователей одним вызовом API.

Подробнее см. https://randomuser.me/documentation#multiple.

Пример:

https://randomuser.me/api/?results=20
...