2016-12-30 9 views
0

Я создаю приложение погоды, используя Node.js для доступа к текущей погоде.Как получить доступ к переменным в закрытии в Javascript

Когда я называть openweatherapp API, переменная температура извлекается через JSON, что я пытаюсь передать module.exports вложен в ряд функций закрытия.

Есть ли у меня доступ к temperature и передать его через module.exports, чтобы я мог получить данные из другого файла?

var http = require('http') 

const apiKey = "myAPIkey" 

// Connect to API URL api.openweathermap.org/data/2.5/weather?q={city name} 
function accessWeather(city, callback) { 

    var options = { 
    host: "api.openweathermap.org", 
    path: "/data/2.5/weather?q=" + city + "&appid=" + apiKey + "", 
    method: "GET" 
    } 

    var body = "" 

    var request = http.request(options, function(response) { 

    response.on('data', function(chunk) { 
     body += chunk.toString('utf8') 
    }) 
    response.on('end', function() { 

     var json = JSON.parse(body) 
     var temperature = parseInt(json["main"]["temp"] - 273) 
    }) 
    }) 
    request.end() 
} 

temp = accessWeather("Calgary") 
console.log(temp) 

module.exports = { 
    accessWeather: accessWeather 
} 

ответ

1

Здесь у нас есть неправильное представление о том, как работает async в JavaScript. Вы не можете вернуть данные, которые будут загружены в будущем.

Существует несколько вариантов решения этой проблемы.

1) Экспорт функцию, которая принимает другую функцию в качестве параметра и вызвать эту функцию, если разрешить ваши данные:

module.export = function accessWeather(city, callback) { 

    var options = { 
    host: "api.openweathermap.org", 
    path: "/data/2.5/weather?q=" + city + "&appid=" + apiKey + "", 
    method: "GET" 
    } 

    var body = "" 

    var request = http.request(options, function(response) { 

    response.on('data', function(chunk) { 
     body += chunk.toString('utf8') 
    }) 
    response.on('end', function() { 

     var json = JSON.parse(body) 
     var temperature = parseInt(json["main"]["temp"] - 273); 
     callback(temperature); 
    }) 
    }) 
    request.end() 
} 

2) Поскольку стиль обратного вызова наследие сейчас, вы можете сделать что-то еще лучше Обещания.

module.export = function accessWeather(city, callback) { 

    return new Promise(function(resolve, reject){ 
    var options = { 
    host: "api.openweathermap.org", 
    path: "/data/2.5/weather?q=" + city + "&appid=" + apiKey + "", 
    method: "GET" 
    } 

    var body = "" 

    var request = http.request(options, function(response) { 

    response.on('data', function(chunk) { 
     body += chunk.toString('utf8') 
    }) 
    response.on('end', function() { 

     var json = JSON.parse(body) 
     var temperature = parseInt(json["main"]["temp"] - 273); 
     resolve(temperature); 
    }) 
    }) 
    request.end() 
    }); 
} 

Вы также можете использовать функции ESNext, такие как генераторы, и то, что я предпочитаю, даже если использовать Observables.

 Смежные вопросы

  • Нет связанных вопросов^_^