JavaScript Fetch API:全局访问本地变量

时间:2018-05-17 17:39:13

标签: javascript arrays variables global fetch-api

我正在使用Fetch API处理项目。我想使用fetch从文本文件中获取一些数据并将它们放入数组中,以便我可以使用它们。我不确定用什么代码来使变量全局化。我认为通过在fetch语句之外初始化变量,我可能能够以这种方式使用它。这就是我到目前为止所拥有的:

animals.txt

const animalArray;
fetch('animals.txt')
    .then((res) => res.text())
    .then(data => {
      animalArray = data.split(/\r?\n/) //how can I access this outside of the fetch statement?
} 
})

index.js

#Lib requests

import requests
import bs4

fonte = requests.get('https://www.noticiasaominuto.com/')
soup = bs4.BeautifulSoup(fonte.text, 'lxml')
body = soup.body

for paragrafo in body.find_all('p', class_='article-thumb-text'):
      print(paragrafo.text)
      conteudo = paragrafo.text

id = requests.get('https://api.telegram.org/bot<TOKEN>/getUpdates')
chat_id = id.json()['result'][0]['message']['from']['id']

print(chat_id)

msg = requests.post('https://api.telegram.org/bot<TOKEN>/sendMessage', data = {'chat_id': chat_id ,'text' : conteudo})

2 个答案:

答案 0 :(得分:2)

嗯,有一件事,你试图重新分配一个被禁止的const声明。我希望您的代码能够正常运行,您必须将其更改为let。然后,要使其全局化,请将其绑定到浏览器中的全局对象window

但是,异步请求的原则是您希望在执行某些操作之前等待数据到达,因此将fetch的结果放在全局范围内的用途非常有限,因为您希望能够知道数据何时已经到了。

为了做到这一点,您只需要在.then()的{​​{1}}中执行任何操作。 几乎总是一种更好的方式来处理异步数据,而不是污染全局范围,并且有一个复杂的事件系统或超时检查特定全局变量的变化。

答案 1 :(得分:0)

这个问题的答案取决于你如何操纵数据。您是在手动控制台内执行代码还是在网页/脚本文件中执行代码?

如果您只是在控制台中执行代码,那么将数据分配给全局对象就可以了。我至少会打印一条消息,知道何时完成提取并且数据可供使用。

如果您将代码作为较大脚本的一部分执行,那么您需要在承诺链中继续您的代码,否则您将遇到时序问题。这是因为fetch是异步的,并且在结束请求之前数据将不可用。通常,最好将数据作为参数传递而不是使用全局对象,因为它使程序的流程更加明显。