После того, как я отправлю форму с именем актера / актрисы, и в ней будут перечислены фильмы, если я захочу снова выполнить поиск, введя другое имя, при первом нажатии кнопки ВВОД будут возвращены те же фильмы, что и при первом поиске, и если я затем снова нажмите Enter с введенным новым именем, в нем перечислены фильмы этого актера / актрисы. Таким образом, в основном он перечисляет фильмы при каждой второй отправке (учитывая, что имя актера / актрисы изменилось). Это можно обойти? Я попытался добавить sessionStorage.clear() в функцию отправки формы, но это не сработало. Я также пробовал actor.value.clear(), но это очищает значение ввода формы и ничего не перечисляет. Любая помощь приветствуется, заранее большое спасибо. Вот код:
const form = document.getElementById("form");
form.addEventListener("submit", (e)=>{
var actor = document.getElementById("actor").value;
var byActor = document.getElementById("byActor");
byActor.innerHTML = actor;
discoverByActor(actor);
moviesByActor();
e.preventDefault();
})
function discoverByActor(actor){
axios.get("https://api.themoviedb.org/3/search/person?api_key=<API_KEY>&language=en-US&query = "+actor+'&page=1&include_adult=false')
.then((response)=>{
let actorId = response.data.results[0].id;
sessionStorage.setItem("theActorId", actorId);
})
};
function moviesByActor(){
let actorId = sessionStorage.getItem("theActorId");
axios.get("https://api.themoviedb.org/3/discover/movie?api_key=<API_KEY>&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_people = "+actorId)
.then((response)=>{
console.info(response);
let movies = response.data.results;
let output = "";
$.each(movies, (index, movie)=>{
output +=`
<div class = "card">
<img src = "http://image.tmdb.org/t/p/w300/${movie.poster_path}" onerror = "this.onerror=null;this.src='../images/image2.png';">
<h3>${movie.title}</h3>
<p>${movie.vote_average} <strong>IMDB Rating</strong></p>
<p>Release date: <strong>${movie.release_date}</strong></p>
<a onclick = "movieSelected('${movie.id}')" class = "btn" href = "#"> Movie Details </a>
</div>
`
})
let moviesInfo = document.getElementById("movies");
moviesInfo.innerHTML = output;
//Display pages buttons.
let pages = document.querySelector(".pages");
pages.style.display = "flex";
var actor = document.getElementById("actor");
})
}
Сбросьте значение с помощью document.getElementById ('"субъект"). Value = ""; не ясно()
Джордж, я храню идентификатор актера в sessionStorage, поэтому я могу использовать его, чтобы он отображал фильмы, в которых играет этот конкретный актер. Запрос API на обнаружение фильмов with_people (второй запрос) использует идентификатор Актера (предоставленный первым запросом API) для вывода списка фильмов, в которых он играет. Я понял, что так и должно быть, но я также могу ошибаться, поскольку я довольно новичок в JavaScript (учился самостоятельно около 3 недель), потому что первый запрос API не содержит данных о фильмах. сами по себе второй запрос не может связать фильм с актером. Только так ..



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


sessionStorage.setItem("theActorId", actorId);
не происходит, пока вы не получите ответ от axios.get. Однако перед этим вы вызываете moviesByActor, что делает
let actorId = sessionStorage.getItem("theActorId");
Вероятно, вы захотите:
form.addEventListener("submit", (e)=>{
// ...
discoverByActor(actor).then(moviesByActor);
// ...
})
function discoverByActor(actor){
return axios.get("https://api.themoviedb.org/3/search/person?api_key=<API_KEY>&language=en-US&query = "+actor+'&page=1&include_adult=false')
.then((response)=>{
let actorId = response.data.results[0].id;
sessionStorage.setItem("theActorId", actorId);
})
};
Кроме того, если вам действительно не нужен actorId в сеансе, вы можете:
form.addEventListener("submit", (e)=>{
// ...
discoverByActor(actor).then(moviesByActor);
// ...
})
function discoverByActor(actor){
return axios.get("https://api.themoviedb.org/3/search/person?api_key=<API_KEY>&language=en-US&query = "+actor+'&page=1&include_adult=false')
.then((response)=>{
return response.data.results[0].id;
})
};
function moviesByActor(actorId) {
axios.get( /* ... */ );
// ...
}
В JavaScript есть модель параллелизма, основанная на «цикле событий». Очень интересным свойством модели цикла событий является то, что JavaScript, в отличие от многих других языков, никогда не блокируется (за исключением alert или синхронного XHR и, я уверен, некоторых других).
axios.get(url).then(doSomething) является асинхронным, поэтому, когда вы делаете это, вы говорите компьютеру: «иди и принеси все, что находится по этому URL-адресу, а как только вы получите ответ, отправь ответ на doSomething. А пока продолжай выполнять остальную часть этого кода.
Итак, когда вы делали discoverByActor(actor); moviesByActor();, вы вызывали moviesByActorдаже если, вы ничего не получали от discoverByActor.
Конечно, было бы сложно программировать, если бы вы не могли контролировать порядок, в котором происходят события, поэтому для решения этой проблемы мы используем то, что называется Promises.
С помощью обещания мы можем сказать, идите и получите этот URL-адрес с помощью axios.get, .then использует этот результат для выполнения другой задачи, .then использует все, что возвращает что, для выполнения другой задачи.
Итак, у меня discoverByActor возвратил axios.get, так что я мог получить доступ к методу .then, чтобы я мог терпеть, что moviesByActor будет иметь данные, необходимые для запуска.
Спасибо, трюк сработал, теперь все работает как положено. Поскольку я все еще новичок в JavaScript (и языках программирования в целом), не могли бы вы, если у вас есть свободное время, объяснить мне, почему мне пришлось поместить «discoverByActor (актер) .then (moviesByActor)» в функцию отправки формы и » вернуть "перед axios.get, чтобы заставить его работать?"
Счастлив! Я просто добавил объяснение, дайте мне знать, если в нем больше смысла
Большое спасибо, я очень ценю это, теперь это имеет смысл. Спасибо ! : D
зачем вы храните его в
sessionStorage? Я имею в виду, зачем тебе это нужно?