Запрашивает данные из конечной точки REST в цикле, работает в FF, а не в chrome

#javascript #angularjs #google-chrome #firefox

#javascript #angularjs #google-chrome #firefox

Вопрос:

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

Это отлично работает в Firefox, но в Chrome он получает только 1 изображение и устанавливает его для всех пользователей.

Странно то, что $http запрос get вызывается правильное количество раз в Chrome.

Есть идеи, что здесь происходит?

 // Loop through all the users
for(var i = 0; i < $scope.users.length; i  ) {
  get_image(i);
}

// Fetches a random image and adds it to a user
function get_image(index) {

  console.log('index = ' index);

// TODO: Something's screwy with this. in FF it loads a new image per user, in chrome it loads the same image for all user
  $http.get('http://uifaces.com/api/v1/random').then(function(response) {
    console.log('in get');  // <-- This line get's called as many times as there are users in my array.
    $scope.users[index].face = response.data.image_urls.normal;
  });
}
 

Комментарии:

1. Может быть, посмотрите на заголовки?

2. $scope.user[index].face = response.data.image_urls.normal; кажется, не хватает s , не так ли $scope.users[index] ?

3. Если вы откроете chrome dev tools, перейдете на вкладку сеть и посмотрите ответы на http-запросы, все ответы одинаковые или разные? Вы также можете попробовать установить точку останова, console.log('in get'); просто чтобы посмотреть на все.

4. похоже, chrome запоминает вещи дольше, попробуйте очистить кеш. это все объяснило бы и было бы легко исправить. будем надеяться, что это так…

5. В Chrome есть только 1 запрос к uifaces на вкладке сеть, поэтому я ничего не могу сравнить. @dandavis вы говорите, что запрос к uifaces кэшируется, поэтому он выполняет 1 запрос, затем в следующий раз, когда он сталкивается с кодом для другого запроса, он просто говорит: «О, привет, я только что сделал этот запрос. Я просто верну те же данные? можете ли вы привести пример для уничтожения кэша?

Ответ №1:

Я думаю, что это условие гонки. Я не уверен, почему это работает именно так, но я реализовал получение gravatars с помощью этого метода — https://github.com/caolan/async#each , существует асинхронная версия для использования в браузере.