JavaScript

Как вернуть что-нибудь из вложенной функции в JS

использую node.js, но столкнулся с одной проблемой.
function getData(type, id){
var data = {};
request.get('https://сайт:8080/api/' + type + 's/' + String(id), (error, response, body) => {
if(error != null){
data = {error: 'Произошла ошибка...' };
return;
}
//Манипуляции с ответом..
console.log(data);//тут все прошло успешно
});
console.log(data);//пустой объект
return data;
}
По сути, это должно возвращать содержимое :/
Как исправить?
До вызова функции назначьте переменную скажем так data1=0; а в функции впишите в неё data1=data;
console.log(data1);//всё должно работать
Борис Дерябин
Борис Дерябин
54 983
Лучший ответ
Андрей Карселадзе не понял =) Можно кодом?
Тут не во вложенности дело.
Вам нужно понять асинхронную модель node.js
Когда нода делает запрос для получения времени, на это тратится какое то время.
Нода не будет ждать ответа и в это время продолжит выполнять код программы дальше.
И только когда сторонний сервер вернет вам нужное время - нода обработает ответ и выдаст его.

т. е.
вот вы делаете запрос
request.get( http... (error, response, body) => { ...})

request.get - это асинхронная операция. Она стартанула и ждёт ответа от сервера. Когда придёот ответ, он будет обрабан вложенной функцией коллбеком (error, response, body) => { ...}

И теперь взгляните на свой код (уберу лишнее для понятности)

var data = {}; // создали пустой объект
request.get( http... (error, response, body) => { ...}) // сделали запрос к серверу, а пока ждём, нода работает дальше
console.log(data);//пустой объект (он и будет пустым, потому что ответ ещё не пришёл и в data ничего не прилетело)

Для возврата из функции времени, вам надо его возвращать ПОСЛЕ ответа. т. е. из коллбека, после вот этой строки
console.log(data);//тут все прошло успешно

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