调用 Fetch with Click

Call Fetch with Click

我已经设置了一个从 API 请求随机短语的获取请求。这在 window 重新加载或初始加载时调用。我创建了一个按钮,单击该按钮会重新 运行 我设置的提取。目前它不工作,我收到这个错误:

Uncaught (in promise) TypeError: 'fetch' called on an object that does not implement interface Window.

Javascript代码

var generateBtn = document.getElementById('generateSP');
generateBtn.addEventListener('click', fetch);

fetch('https://random-words-api.herokuapp.com/w?n=10')
  .then(
    function(response) {
      if (response.status !== 200) {
        console.log('Looks like there was a problem. Status Code: ' +
          response.status);
        return;
      }
      response.json().then(function(data) {
        console.log(data);
        document.getElementById('w3review').value = data;
      });
    }
  )
  .catch(function(err) {
    console.log('Fetch Error :-S', err);
  });

不要将点击处理程序直接绑定到 fetch,那样根本行不通。创建您自己的调用 fetch() 的函数并将侦听器绑定到

const loader = async () => {
  try {
    const res = await fetch('https://random-words-api.herokuapp.com/w?n=10')
    if (!res.ok) {
      throw new Error(`${response.status}: ${await response.text()}`)
    }
    const data = await response.json()
    console.log(data);
    document.getElementById('w3review').value = data;
  } catch (err) {
    console.error(err)
  }
}

document.getElementById('generateSP').addEventListener('click', loader);

loader() // initial run

要详细说明错误消息,fetch 必须 调用绑定到 window 对象。任何事件侦听器都绑定到触发事件的元素,因此就像尝试调用

const boundFetch = window.fetch.bind(generateBtn)
boundFetch(event)

这会导致您的错误。

只需用一个函数包装您的代码。你不能这样调用 fetch。

var generateBtn = document.getElementById('generateSP');
generateBtn.addEventListener('click', fetchData);

function fetchData() {
  fetch('https://random-words-api.herokuapp.com/w?n=10')
    .then(function (response) {
      if (response.status !== 200) {
        console.log(
          'Looks like there was a problem. Status Code: ' + response.status
        );
        return;
      }
      response.json().then(function (data) {
        console.log(data);
        document.getElementById('w3review').value = data;
      });
    })
    .catch(function (err) {
      console.log('Fetch Error :-S', err);
    });
}

您需要将 fetch 调用包装在自定义回调中,它不能用作 addEventListener 的参数:

var generateBtn = document.getElementById('generateSP');
generateBtn.addEventListener('click', myFetcher);

function myFetcher() {
fetch('https://random-words-api.herokuapp.com/w?n=10')
  .then(
    function(response) {
      if (response.status !== 200) {
        console.log('Looks like there was a problem. Status Code: ' +
          response.status);
        return;
      }
      response.json().then(function(data) {
        console.log(data);
        document.getElementById('w3review').value = data;
      });
    }
  )
  .catch(function(err) {
    console.log('Fetch Error :-S', err);
  })
}
myFetcher();

您的原始代码在点击时调用 fetch(),没有 url 或传递给它的参数。