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
return axios.get
, чтобы я мог получить доступ к методу .then
, чтобы я мог вынести, что moviesByActor
будет иметь данные, необходимые для запуска.