2

我正在尝试使用forecast.io API(最终)制作一些东西,每天都会通过电子邮件向我发送关于我所在地区天气的信息。当我向 API 发出请求时,它会给我一个 JSON 对象,其中包含所有信息。我正在使用 JavaScript 和 PHP 编写这个。这是我到目前为止的代码(现在有点乱):

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript">

var latitude = "42";
var longitude = "-71";
var coordinates = latitude + "," + longitude;

var forecast;

$.ajax({
  url: "<?php echo $_SESSION['url'] ?>42,-71",
  type: "GET",
  dataType: "jsonp",
  crossDomain: true,
  jasonpCallback: 'blah',
  success: function(data) {
    forecast = data;
    console.log(forecast.daily.summary);
  },
  error: function() {
    console.log("This failed.");
  }
});

//**********************************

document.write(getDailySummary());


//**********************************
function getDailySummary() {
  var summary = forecast.daily.summary;
  return "<p>" + summary + "</p>";
}

</script>

现在,$.ajax() 语句成功运行,并且预测摘要记录在控制台中。但是,它的getDailySummary()运行并不顺利。运行此程序时出现以下错误:

Uncaught TypeError: Cannot read property 'daily' of undefined           index.php:42
  getDailySummary                                                       index.php:42
  (anonymous function)                                                  index.php:37
Rain on Thursday and Friday; temperatures rising to 85° on Saturday.    index.php:28

这使它听起来像forecast未定义。我最初的想法是它与范围有关,但我试过摆弄各种各样的东西,包括将预测定义为window.forecast,但我总是得到这个错误。我哪里错了?

4

2 回答 2

4

Ajax 是异步的。

ajax 方法下面的行在填充数据之前执行。在里面调用那个函数success handler

因此,当您尝试访问forecast object它时,它仍然是未定义的。

success: function(data) {
    forecast = data;
    console.log(forecast.daily.summary);

    getDailySummary(forcast);
  },

并且永远不要用于document.write写入您的 HTML。尝试将数据附加到页面上的某个元素。

于 2013-08-05T23:53:53.720 回答
0

该行:

document.write(getDailySummary());

在 ajax 调用成功完成之前被调用,这就是你得到错误的原因,因为forecast尚未分配。Ajax 是异步的

于 2013-08-05T23:55:24.720 回答