如何在 fetch API 请求中包含 if-else 条件?

How to include an if-else condition in fetch API request?

我正在尝试制作一个发送模因的 discord 机器人。我想要一个 NSFW 图片过滤器。我正在使用的 API 在响应中给出 nsfw: true/false。 这是我的代码

async function getMeme() {
  subreddit = memeSubreddits[Math.floor(Math.random() * memeSubreddits.length)];
  try {
    const res = await fetch(`https://meme-api.herokuapp.com/gimme/${subreddit}`);
    const data = await res.json();
    return data["url"];
  } catch (err) {
    console.log(err);
  }
}

我想做类似的事情

while (data["nsfw"]===true){
    //make fetch request again
}

我将此 meme 作为不和谐消息发送为

client.on("messageCreate", (message) => {
  if (message.content === "-meme") {
    getMeme().then((meme) => message.channel.send(meme));
  }
});

我可以在这里检查 NSFW 条件并说“您请求的图像是 NSFW”吗?

您可以使 getMeme 成为递归函数。

async function getMeme() {
    subreddit = memeSubreddits[Math.floor(Math.random() * memeSubreddits.length)];
    try {
        const res = await fetch(`https://meme-api.herokuapp.com/gimme/${subreddit}`);
        const data = await res.json();
        if (data.nsfw) return getMeme();
        else return data.url;
    } catch (err) {
        console.log(err);
    }
}

我还强烈建议在调用者中捕获错误,而不是在 getMeme 本身中捕获错误(这将导致错误导致已解决的 Promise 解析为 undefined)。

function getMeme() {
    const subreddit = memeSubreddits[Math.floor(Math.random() * memeSubreddits.length)];
    return fetch(`https://meme-api.herokuapp.com/gimme/${subreddit}`)
        .then(res => res.json())
        .then((data) => {
            if (data.nsfw) return getMeme();
            else return data.url;
        });
}
client.on("messageCreate", (message) => {
    if (message.content === "-meme") {
        getMeme()
            .then((meme) => message.channel.send(meme))
            .catch((error) => {
                // handle errors here
            });
    }
});