ruchej
@ruchej
Конструктор мебели. Пишу макросы для К3-Мебель

Почему работает не так, как я хочу?

Вопрос достоин блондинки, ,т.к. JS для меня чужеродное, но необходимое.
Суть. Ниже пример кода.
Входная функция slideshow. В ней запускается функция creategalleryBoxViewBody. В этой функции я хочу получить данные, выполняя другую функцию data = getproddata(parseInt(link.dataset.prodid)) ; Для проверки пишу следующей строкой alert (data). Так же внутри функции getproddata так же для проверки вставляю alert ("Input" + data). Когда код выполняется, то сначала выводится alert (data) из функции creategalleryBoxViewBody, при этом переменная data не определена, хотя при трассировке, в строке data = getproddata(parseInt(link.dataset.prodid)) мы заходим в саму функцию getproddata, правда внутри этой функции не срабатывает alert.
Дальше код отрабатывается, выводится окно с картинкой и! выводится alert ("Input" + data) из getproddata с нужной информацией.
Вопрос: почему js работает не так, как я ожидаю? почему я не получаю значение при вызове data = getproddata(parseInt(link.dataset.prodid)) ;? Вообще не логично. Как же правильно?
function slideshow(evt) {
    let link = evt.currentTarget ;
    creategalleryBoxViewBody(link) ;
}

function creategalleryBoxViewBody(link) {
    closegalleryBox() ;
    var container = document.createElement('div') ;
    data = getproddata(parseInt(link.dataset.prodid)) ;
    alert (data)
    container.innerHTML = '<div id="galleryBox_view" class="galleryBox"> \
        <div class="galleryBox_content"> \
            <span id="close_galleryBox" onclick="closegalleryBox()">&times;</span> \
            <img src="' + link.src + '" alt="Картинка"> \
            </div> \
        </div>' ;
    document.body.appendChild(container.firstChild) ;
}

function closegalleryBox() {
    let galleryBox = document.getElementById("galleryBox_view");
    if (galleryBox) { galleryBox.remove() ; }
    return true ;
}

window.onclick = function(event) {
    if (event.target == document.getElementById("galleryBox_view")) {
        closegalleryBox();
    }
}
//-----------------------------------------------
// ajax запросы
function status(response) {  
  if (response.status >= 200 && response.status < 300) {  
    return Promise.resolve(response)  
  } else {  
    return Promise.reject(new Error(response.statusText))  
  }  
}

function json(response) {  
  return response.json()  
}

function getproddata(prod_id) {
    fetch('getproduct/'+prod_id)  
      .then(status)  
      .then(json)  
      .then(function(data) {  
        console.log('Request succeeded with JSON response', data);
        alert ("Input" + data)
        return (data) ; 
      }).catch(function(error) {  
        console.log('Request failed', error);  
      });
}
  • Вопрос задан
  • 250 просмотров
Решения вопроса 1
function creategalleryBoxViewBody(link) {
    closegalleryBox() ;
    var container = document.createElement('div') ; 

    getproddata(parseInt(link.dataset.prodid)).then(function(data){
       alert (data);
    });
 
    container.innerHTML = '<div id="galleryBox_view" class="galleryBox"> \
        <div class="galleryBox_content"> \
            <span id="close_galleryBox" onclick="closegalleryBox()">&times;</span> \
            <img src="' + link.src + '" alt="Картинка"> \
            </div> \
        </div>' ;
    document.body.appendChild(container.firstChild) ;
}

function getproddata(prod_id) {
    return fetch('getproduct/'+prod_id)  
      .then(status)  
      .then(json)  
      .then(function(data) {  
        console.log('Request succeeded with JSON response', data);
        alert ("Input" + data)
        return (data) ; 
      }).catch(function(error) {  
        console.log('Request failed', error);  
      });
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
в функции getproddata вы используете fetch('getproduct/'+prod_id)
это асинхронный запрос к серверу, это значит, что на момент его выполнения вы гарантированно послали только запрос на север. Ответа от сервера еще надо дождаться, для это у вас есть колбеки в .then(), там уже приходит ответ от сервера (он приходит позже)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Artezio Санкт-Петербург
от 160 000 до 220 000 ₽
01 мар. 2021, в 17:17
800 руб./в час
01 мар. 2021, в 17:05
25000 руб./за проект
01 мар. 2021, в 16:46
150000 руб./за проект