0

Попросили сделать API. Вроде не сложно. Сделал, решил нормальный скрипт на js написать, с классами, промисами, со структурой в общем. В итоге споткнулся на callback-ах)

метод

  #readHTMLFile(file, back) {
            let http = new XMLHttpRequest();
            if (this.#checkFileExist(file, http)) {
                    http.onreadystatechange = function() {
                        if (this.readyState == 4 && this.status == 200)
                            if(back) window.responseCustom = back(this.responseText)
                }
                http.open("GET", file, true);
                http.send();

                console.log(window);
        } else (new API()).ShowError({message: 'Error in reading the file component'});
    }

я вызываю back функцию, которая дальше идет, и возвращает в ответ промис, который я хочу вернуть из функции.

Но как бы я не старался, не могу этого сделать. Я уже и в window - решил записать

 if(back) window.responseCustom = back(this.responseText)

Я вижу, в консоле, что св-во есть (смотри вложения)

console.log(window);

Св-во

Запросы

Но когда пытаюсь напрямую обратиться, то пишет undefined

console.log(window.responseCustom);

CallBack функция

                    let pr = this.#readHTMLFile(filesName, function (filesText) {
                        let virtualDocument = document.implementation.createHTMLDocument("Virtual Document");
                        virtualDocument.documentElement.innerHTML = filesText;
                        let l = virtualDocument.querySelectorAll(".block-container");

                        l.length > 0 ? l : (new API()).ShowError({message: 'Error: File is empty'})

                        //Запрос за данными

                        let pars_meth = (new Parsing(1)).parsing(action);
                        if (typeof pars_meth === 'object')
                        {
                            const API_STAND = new API('fgjfkgjkfjg');

                            return API_STAND.makeQuery(pars_meth.name, obj => {
                                pars_meth.name = pars_meth.name.replace(/\/api\//i, '');

                                // Используем Фейкер. ТОЛЬКО ДЛЯ ТЕСТА!!!
                                obj = (new Faker(pars_meth.name, 200)).getDataFaker();

                                window.aa = obj;

                                if (obj.status === "error") {
                                    (new API()).ShowError({message: obj.data.message})
                                    return false;
                                }

                                Object.keys(obj.data).map(function(message, index) {
                                    let h = '.'+pars_meth.name+'_'+message;
                                    // console.log(h);
                                    // Ищем классы, и заменяем данные
                                    let current_el = l[0].querySelector('.'+pars_meth.name+'_'+message);
                                    if (current_el !== null) {
                                        if (pars_meth.parse === 'li' && (current_el.tagName === 'OL' || current_el.tagName === 'UL') ) {
                                            let p = obj.data[message].split(/(\d+)/);
                                            obj.data[message] = '';
                                            p.forEach(function (t, i) {
                                                if (i % 2 === 0 && i !== 0) {
                                                    obj.data[message] += "<li>" + t + "</li>";
                                                }
                                            })

                                        }
                                        current_el.innerHTML = obj.data[message]
                                    }
                                });
                                // Перебираем полученные nodes и вставляем в родительский документ (основной)
                                let AddSection = document.getElementsByClassName('container')[0];
                                AddSection.innerHTML = '';
                                [].forEach.call(l, function(item) {
                                    AddSection.appendChild(item);
                                });

                                return obj;

                            }, pars_meth.method);

                        }
                });

Подскажите пожалуйста в чем проблема может быть

  • Скорее всего вы его просто не дожидаетесь, попробуйте использовать async/await – kertAW Dec 07 '20 at 13:21
  • Спасибо, поставил settimeout - заработало – S.Solomon Dec 07 '20 at 13:26
  • @S.Solomon, setTimeout - плохое решение, потому что можешь не угадать с интервалом и ждать либо слишком долго, либо не дожидаться ответа – Grundy Dec 08 '20 at 08:35

0 Answers0