使用 Click 调用 Fetch

Posted

技术标签:

【中文标题】使用 Click 调用 Fetch【英文标题】:Call Fetch with Click 【发布时间】:2022-01-22 13:15:26 【问题描述】:

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

Uncaught (in promise) TypeError: 'fetch' called on an object that doesn't 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);
  );

【问题讨论】:

【参考方案1】:

不要将点击处理程序直接绑定到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)

这会导致您的错误。

【讨论】:

【参考方案2】:

您需要将 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 或参数。

【讨论】:

【参考方案3】:

只需用函数包装您的代码。你不能这样调用 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);
    );


【讨论】:

以上是关于使用 Click 调用 Fetch的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fetch 制作通用 API 调用函数

在序列中调用 React js Fetch 调用

使用 fetch API 时在 AJAX 调用期间显示微调器

不使用 node-fetch 调用的快速路由

fetch() 完成后如何调用函数

使用 fetch 在节点中进行异步 api 调用的最佳实践?