2017-01-09 3 views
-1

У меня есть следующий код яваскрипта, проблема заключается в том, что первый выполнил функцию getBestMovies4BestPCRating(); и после amovies.forEach(function(item) {Javascript приоритет вызова функции onreadystatechange

любая идея?

document.getElementById('sendMovies').addEventListener('click', function() { 
    var movieIDs = document.getElementById('MovieIDs').value; 
    var data = {}; 
    var amovies = {}; 
    var movies = {}; 

    data["movieList"] = '[' + movieIDs + ']'; 

    params = JSON.stringify(data); 

    var http = new XMLHttpRequest(); 

    var url = "http://............." 
    http.open("POST", url, true); 

    //Send the proper header information along with the request 
    http.setRequestHeader("Content-type", "application/json"); 

    http.onreadystatechange = function() { //Call a function when the state changes. 
     if (http.readyState == 4 && http.status == 200) { 
      movies = http.responseText; 
      amovies = JSON.parse(movies); 

      amovies.forEach(function(item) { 
       if (item.rating > 4) { 
        getEntitiesRatings(item.ratingsPK.userId, 0); 
       } 
      }); 
      getBestMovies4BestPCRating(); 
      convertmovies2table(bestMovies); 
     } 
    } 
    http.send(params); 

}); 

function getEntitiesRatings(userid, kind) { 

    var xmlhttp = new XMLHttpRequest(); 
    var url = " http://.............entities.ratings/" + userid; 

    xmlhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      var myArr = JSON.parse(this.responseText); 
      if (kind == 0) { 
       computeUserColleration(myArr, userid); 
      } 
      if (kind == 1) { 
       bestUserMovies(myArr, userid); 
      } 
     } 
    }; 
    xmlhttp.open("GET", url, true); 
    xmlhttp.send(); 

} 
+0

Функция 'getEntitiesRatings' является асинхронной. Они * запускаются * до запуска 'getBestMovies4BestPCRating', но не заканчиваются * до тех пор, пока не будут. –

+1

И я не вижу, где назначается bestMovies? Но Хазмат прав, вы собираетесь прокручивать массив и запускать множество аякс-запросов, а затем пытаться обрабатывать результаты как массив, не зная, что все запрошенные завершены, и массив был полностью назначен. –

ответ

1

Функции выполняются в том порядке, в котором вы их пишете. Однако первая функция является асинхронной, поэтому результат не будет сразу доступен.

Вместо этого используйте вместо этого Promise.

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

+0

можно пример? – Giorgos

Смежные вопросы