【问题标题】:How to use if / else statement with a JSON fetch API response Javascript如何使用带有 JSON 获取 API 响应 Javascript 的 if / else 语句
【发布时间】:2021-08-16 22:10:08
【问题描述】:

我有两个工作代码 sn-ps,我想将它们与 if/else 逻辑链接。代码的第一部分从 Web API 接收 JSON 响应。 JSON.TEMPERATURE 是需要的关键变量。

const fetch = require("node-fetch");

const api_url = 'https://www.placeholder_URL.com/api/getTemperature'

fetch(api_url)
  .then((response) => {
    return response.json();
  })
  .then((myJSON) => {
    console.log(myJSON.TEMPERATURE); // **This returns a number between 8 and 15**
  });

代码的第二部分播放一个​​ MIDI 音符。在下面的例子中,note#60 是中间 C。C# 是 note61,D note62 等等。

let easymidi = require("easymidi")
let output = new easymidi.Output("mindiPort", true)

let sendNote = (noteValue, duration) => {
    output.send("noteon", noteValue)

    setTimeout(()=> {
        output.send("noteoff", noteValue)
    }, duration);
}

setInterval(() => {
    let noteValue = {
        note: 60,   // **need to change this number depending on JSON.TEMPERATURE**
        velocity: 100,
        channel: 1
    }
    sendNote(noteValue, 500)
}, 2000);

我想要实现的是if/else,其中播放的音符取决于JSON.TEMPERATURE

类似:

if JSON.TEMPERATURE ==8,玩note60

if JSON.TEMPERATURE ==9,玩note61

else,弹奏音符 55

我还想每 5 秒运行一次 API 请求。

【问题讨论】:

  • 令人尴尬的是——我试图用 python 解决这个问题,但我不能。我还在努力学习 Javascript
  • 您当前的代码将持续每 2 秒发送一次便笺(每次持续半秒) - 您要这样做还是只发送一次?
  • @Jamiec 请一次。谢谢。

标签: javascript json if-statement fetch-api


【解决方案1】:

似乎您只需要一个if 语句,例如

if(myJSON.TEMPERATURE == 8){
   note = 60;
}
else if(myJSON.TEMPERATURE == 9){
   note = 61;
}
else{
  note = 55;
}

因此,只需将其替换为您的 console.log 部分即可。

const fetch = require("node-fetch");

const api_url = 'https://www.placeholder_URL.com/api/getTemperature'

fetch(api_url)
  .then((response) => {
    return response.json();
  })
  .then((myJSON) => {
    let note;
    if(myJSON.TEMPERATURE == 8){
       note = 60;
    }
    else if(myJSON.TEMPERATURE == 9){
       note = 61;
    }
    else{
      note = 55;
    }

    let noteValue = {
        note: note,   
        velocity: 100,
        channel: 1
    }
    sendNote(noteValue, 500)
  });

let sendNote = (noteValue, duration) => {
    output.send("noteon", noteValue)

    setTimeout(()=> {
        output.send("noteoff", noteValue)
    }, duration);
}

【讨论】:

  • 你是天使。在 python 和 Javascript 之间花了你 50 秒的时间已经花了我 5 个小时以上。让我测试一下代码。非常感谢。
  • 看起来我需要一个用于 fetch api 的 catch 块。那是抛出一个错误。但是,这是很大的帮助(尤其是 JS 语法)——我应该可以从这里得到它 :) :)
  • 稍微调整了它 - 也基于下面的答案,它现在可以工作了。谢谢!
【解决方案2】:

您需要在 .then 内部调用 fetch 请求的 setInterval,这样便可以在 api 请求完成并收到 JSON 响应后发送注释。

您当前是如何实现它的,它将每 2 秒调用一次 sendNote。此外,您希望每 5 秒执行一次 api 调用。这意味着我们要清除上一个 api 调用的 sendNote 间隔,这就是间隔变量存在的原因,如果设置了间隔,我们将调用 clearInterval。

当然,您可以通过将其中一些代码放入函数中来抽象它,使其看起来更漂亮,但这就是它的要点

let interval;
const fetch = require("node-fetch");

const api_url = 'https://www.placeholder_URL.com/api/getTemperature'
setInterval(() =>
fetch(api_url)
   .then((response) => {
      return response.json();
   })
.then((myJSON) => {
   if (interval) {
     clearInterval(interval);
   }
   interval = setInterval(() => {
      let note;
      if (myJSON.TEMPERATURE == 8) {
        note = 60;
      } else if (myJSON.TEMPERATURE == 9) {
        note = 61;
      } else {
        note = 55;
      }
      let noteValue = {
         note: note,
         velocity: 100,
         channel: 1
       }
       sendNote(noteValue, 500)
   }, 2000);
 }), 5000);

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2016-06-21
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多