如何在Javascript中访问闭包中的变量

时间:2016-12-30 07:12:45

标签: javascript node.js closures weather-api

我正在使用Node.js创建天气应用以访问当前天气。

当我调用 openweatherapp API 时,通过我试图传递给module.exports的JSON检索的温度变量嵌套在一系列闭包函数中。

我有什么方法可以访问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 个答案:

答案 0 :(得分:1)

在这里,我们误解了异步在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)因为回调风格现在是遗留的,所以使用Promise可以做得更好。

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()
  });
}

如果使用Observables,您还可以使用生成器等ESNext功能以及我更喜欢的功能。