Почему моя функция javascript обнаружена как неработающая при обратном вызове?

недавно я пытаюсь снова заняться программированием после почти семилетнего перерыва. Что меня сейчас беспокоит, так это простой случай, когда функция становится «не» функцией при обратном вызове.

Вот где это происходит:

function xhrcall() {
   let xhr = new XMLHttpRequest();
   xhr.responseType = "json";
   xhr.open("POST", "/api", true);
   xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   xhr.send("token=xxxxxxx");
   xhr.onload = () => {
      let x = xhr.status == 200 ? xhr.response : false;     //console.info(x) gives proper response
      return x;
   }
}

Когда я пытаюсь объявить его в переменной или использовать в качестве обратного вызова, мне выдается Uncaught Error.

Например, если я объявлю это так

let fn = xhrcall()
console.info(fn)        //will gives me undefined result
window.callback = xhrcall()
callback()             //will gives uncaught error not a function

Насколько я помню, все должно быть хорошо и работать, но это не так.

Это могут быть повторяющиеся вопросы, но я надеюсь, что кто-нибудь сможет объяснить, что здесь на самом деле не так. Я пропустил область действия функции? или это проблема с возвратом x?

Спасибо.

let fn = xhrcall() означает «вызвать функцию с именем xhrcall и все, что она возвращает, присвоить это переменной fn».
Pointy 20.07.2024 03:22

Если вы хотите передать или назначить функцию чему-то другому, чтобы ее использовать, вам нужно убрать (). Итак, let fn = xhrcall;

Pointy 20.07.2024 03:22

@Pointy, как вы сказали, let fn = xhrcall() должен присваивать любое возвращаемое значение переменной fn, но вместо этого я использовал console.info(fn) неопределенное значение, поэтому здесь чего-то не хватает.

MC888 Team 20.07.2024 04:25

Ваша функция xhrcall() ничего не возвращает. Обратный вызов onload что-то возвращает, но это не имеет ничего общего с тем, что возвращает xhrcall(). Оператор return работает только для функции, которая является его прямой содержащей функцией.

Pointy 20.07.2024 04:30

@Pointy Ах... теперь, когда вы указали на это, я только что понял, что return x находится за пределами области действия xhrcall(), неудивительно, что он не определен. Теперь я знаю, что делать. Спасибо.

MC888 Team 20.07.2024 05:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
6
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию, если выполнение функции не заканчивается оператором return или если после ключевого слова return нет выражения, то значение return равно undefined.

xhrcall()returnс undefined[1]

Это значение присвоено fn, и ни глобальное свойство undefined, ни примитивное значение undefined не могут быть вызваны, поэтому ваши наблюдения последовательны.


Если вам нужно значение, которое функция стрелки, назначенная xhr.onload, будет return, вам придется найти другой способ получить это значение, поскольку функция стрелки не будет вызываться синхронно.

Вы можете получить это значение, используя EventTarget, которому Event будет отправлено, когда функция стрелки, назначенная xhr.onload, будет запущена и завершится. Event слушатели, слушающие это EventTarget, будут вызваны, когда это Event будет отправлено.

Например:

const xhrApiTarget = new EventTarget()
xhr.onload = () => {
    let x = xhr.status == 200 ? xhr.response : false
    const apiResEvt = new Event("api-res")
    apiResEvt.response = x
    xhrApiTarget.dispatchEvent(apiResEvt)
}
xhrApiTarget.addEventListener("api-res", (apiResEvt) => { apiResEvt.response })

[1] Don’t confuse with the return in the arrow function assigned to xhr.onload.

Спасибо за ответ. Мне никогда не приходило в голову вызвать событие и вернуть значение через ответ на событие. Хотя я уже исправил свой код, используя параметр обратного вызова, я выберу здесь ваш ответ и поэкспериментирую с ним позже. Это интересно и воодушевляет меня. Спасибо.

MC888 Team 21.07.2024 00:41

Другие вопросы по теме