【问题标题】:Why is this variable not defined when I defined it globally? (javascript, p5.js)为什么我在全局定义这个变量时没有定义它? (javascript, p5.js)
【发布时间】:2020-11-20 12:30:48
【问题描述】:

我正在使用 JS 来获取 JSON,并使用 p5.js 库(以下来源)根据其中的数据绘制画布和点。 ellipse() 函数需要获取变量 position,但该变量只能从 console.log("position inside function") 所在的位置访问,而不是全局访问。

我的代码如下:

function setup() {
  createCanvas(400, 400);
}
var position;
function draw() {
  var promise = fetch("http://api.open-notify.org/iss-now.json");
  
  background(20, 29, 22);
  promise.then(response => {
    if (response.status !== 200) {
      console.log('Looks like there was a problem. Status Code: ' +
        response.status);
      return;
    }
    response.json().then(data => {
      window.position = data;
    })
    .catch(error => {
      console.log(error.message);
    })
    console.log("position inside function");
    setTimeout(function(){
      if(position.iss_position.longitude && position.iss_position.latitude)
      console.log("longitude" + position.iss_position.longitude);
      console.log("latitude" + position.iss_position.latitude);
    },500);
  })
  translate(180, 180);
  ellipse(parseFloat(window.position.iss_position.longitude), parseFloat(window.position.iss_position.latitude), 4, 4);
}
<script src="https://github.com/processing/p5.js/releases/download/1.1.9/p5.min.js"></script>

我已经阅读了关于 JS 中全局变量的不同来源,并在变量声明中尝试了 window.position 而不是 position 的不同组合,尝试在没有 var 的情况下声明它并在 setup() 函数中声明它。到目前为止没有任何效果。我有点 JS 菜鸟,我认为这是我忽略的一个非常基本的因素。

【问题讨论】:

  • 你可能想看看this video,它准确地显示了你想要做什么。这个想法是使用 p5js loadJSON() 函数,它将卸载使用 Promise 的工作。正如文档所说,您也可以从preload() 调用loadJSON 以使事情变得更容易。
  • 这太完美了! Shiffman 正在查询相同的 API,太棒了,这解决了我的问题
  • 当你想处理一些事情时,这个人通常在他的频道上有一个非常相关的视频,通常值得一看:)

标签: javascript p5.js


【解决方案1】:

试着把那些线放在一边

translate(180, 180);
ellipse(parseFloat(window.position.iss_position.longitude), parseFloat(window.position.iss_position.latitude), 4, 4);

在你的 response.then() 中。

promise 是异步工作的,当您在 promise 之外调用函数时,可能未设置变量值。

【讨论】:

  • 有道理,对吧?我试过这个,但是由于某种原因,当我从那里而不是在 draw() 范围的外壳中调用 ellipse() 函数时,它似乎有很多错误
  • “相当有问题”是什么意思?由于我不知道您何时要调用这些函数,因此我无法真正帮助您。当您可以在内部使用它们时,为什么还要在承诺之后调用它们?
  • 事实上,当端点查询过于频繁时,我正在查询的服务可能会不稳定。我决定大大降低帧速率(frameRate(1)setup() 函数中),现在它就像魅力一样工作。
  • 最后,指定一个低 frameRate()(在我的例子中为 1)就可以了,但更好的方法是将请求包装在 setTimer() 函数中而不限制帧速率.
猜你喜欢
  • 2015-08-08
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2021-01-14
  • 1970-01-01
相关资源
最近更新 更多