Вызов функции Rest из подключенного скрипта возвращает неопределенное вместо данных

#javascript #html #node.js #asynchronous #promise

#javascript #HTML #node.js #асинхронный #обещание

Вопрос:

Я делаю Rest API на javascript, чтобы улучшить себя и немного повеселиться… И API работает хорошо!

 const getMethod = function(reqType){
    let req;
    if(!reqType){
        req=server ":" port;
    }
    else{
        req=`${server}:${port}/${reqType}`;
    }
    fetch(req,{mode:'cors'})
    .then(response=>{
        if(response.ok===true){
            response.json().then(res=>{
                console.log(res);
                return res;
            }).catch(err=>console.error(err));
        } else{
            console.error('Error. Status code: '  response.status   ' '  response.statusText);
            return {message: 'Failed'};
        }
    })
    .catch(err=>{console.error(err);
        return {message: 'Failed'}
    });
}
 

Я знаю, что это можно улучшить, но пока это работает. console.log(res) фактически показывает массив фиктивных данных с экспресс-сервера.

Дело в том, что, чтобы избежать создания другого сервера, я вложил в HTML следующий код:

 <script type="text/javascript">
        window.onload = function(){
            console.log(getMethod());
            const res = getMethod();
            console.log(res);
            classifyInfo(res);
            console.log("Get Information");
        }

        const classifyInfo = function(data){
            const ul=document.getElementsByTagName('section')[1].getElementsByTagName('ul');
            let content='';
            if(data['peliculas']amp;amp;data['clasificaciones']){
                const movies=data['peliculas'];
                const classes=data['clasificaciones'];
                for(let i=0;i<classes.length;i  ){
                    const clasMovies = searchInfo(movies, classes[i].nombre);
                    content =`<li>${classes[i].nombre} <ul>`;
                    for(let j=0;j<clasMovies;j  ){
                        content =`<li>${clasMovies[j].nombre}</li>`;
                    }
                    content ='</ul></li>';
                }
            }
        }

        const searchInfo = function(data, term){
            const returnElement = data.filter(el=>el['clasificacion']==term);
            return returnElement;
        }
    </script>
 

При функции onload значение res становится неопределенным, даже если впоследствии консоль отобразит массив. Однако я не знаю, почему он это делает.

Я пытался использовать await для ожидания ответа, но это тоже не работает.

Любые идеи будут оценены по достоинству 😉

Комментарии:

1. Просто чтобы уточнить, я имею в виду, что window.onload = async function(){ console.log(await GetMethod()); const res = await GetMethod(); console.log(res); classifyInfo(res); console.log(«Получить информацию»); } такжевозвращает undefined (даже когда я получаю данные массива на консоли)

Ответ №1:

Хорошо… Это было проще, чем я думал…

Я полагаю, что я должен просто окружить асинхронный порядок ожидания некоторой попыткой / уловом на всякий случай…

Я изменил свой API следующим образом:

 const getMethod = async function(reqType){
    let req;
    if(!reqType){
        req=server ":" port;
    }
    else{
        req=`${server}:${port}/${reqType}`;
    }
    const response = await fetch(req,{mode:'cors'})

    return response.json();
}
 

Который возвращает обещание, а затем я изменил скрипт в моем html следующим образом:

         window.onload = async function(){
            const res = await getMethod();
            console.log(res);
            classifyInfo(res);
            console.log("Get Information");
        }
 

выполнение обещания и получение моих хороших данных, поступающих с сервера узла.

Мне нравится использовать resolve , reject , но я полагаю, что try / catch сделает то же самое.