использую 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;
}
По сути, это должно возвращать содержимое :/
Как исправить?
JavaScript
Как вернуть что-нибудь из вложенной функции в JS
До вызова функции назначьте переменную скажем так data1=0; а в функции впишите в неё data1=data;
console.log(data1);//всё должно работать
console.log(data1);//всё должно работать
Андрей Карселадзе
не понял =) Можно кодом?
Тут не во вложенности дело.
Вам нужно понять асинхронную модель 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);//тут все прошло успешно
Нода это не линейный язык.
Если работаете с блокирующими операциями, запросами, вводами с клавиатуры, чтением файлов с диска, то проектируйте приложение с учетом того, что пока происходит операция, нуждающаяся в каком то ожидании, нода будет работать дальше
Вам нужно понять асинхронную модель 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);//тут все прошло успешно
Нода это не линейный язык.
Если работаете с блокирующими операциями, запросами, вводами с клавиатуры, чтением файлов с диска, то проектируйте приложение с учетом того, что пока происходит операция, нуждающаяся в каком то ожидании, нода будет работать дальше
Похожие вопросы
- Зачем нужны функции в js?
- Как объявить глобальную переменную внутри функции в js?
- Зачем разработчики js сделали так что там где могли быть функции они добавили методы встроенных объектов.
- Как сделать что бы 2 функции выполнялись поочередно.JS
- Помогите определиться с выбором нового языка (JS(TS) vs Java)
- Js фреймворки, что полезного можно для себя найти?
- В чем цель фреймворков js web?
- [HTML/CSS/JS] Как сохранять изменённые в .js данные оффлайн-сервера локально?
- Почему jQuery методы популярнее js методов при общении с ДоМ?
- ПОЧЕМУ JS ТАКОЙ НЕПОНЯТНЫЙ???