#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 , существует асинхронная версия для использования в браузере.