我已经尝试了我能找到的每个不同版本,试图从获取文件中提取文本并将其保存到一个变量中,以便在用于获取它的异步函数之外访问,但我就是不知道我是什么我做错了。我知道它fetch正在工作,因为我可以从函数内部获取要打印的文件数据。我的一项尝试的当前版本如下所示:
async function getData(filePath) {
await fetch(filePath)
.then(response => {
return response.text()
})
.then(data => alert(data))
.catch(error => alert(error))
}
alert(getData('./2021WeatherData.csv'))
这首先会创建两个警报(无法弄清楚为什么所有事情都会多次发生,但我稍后会担心),读取“[object Promise]”,然后再创建两个带有实际文件内容的警报。所以我知道异步函数正在返回一个 Promise,并且我知道我能够从函数内的文件中提取文本。
这个问题/解决方案(async/await 隐式返回 promise?)告诉我异步函数的结果始终是 Promise,即使在函数中返回字符串、数字等。我试过扔到.text()最后,但是当我这样做我得到“TypeError: getData(...).text is not a function”。
我无法理解的一件事是为什么alert(getData('./2021WeatherData.csv'))在.then(data => alert(data)). 似乎 getData 需要完成return从 Promise 对象到 getData 调用alert的过程,并且在此过程中会在执行此操作之前触发内部.then(data => alert(data))。我不知道这是否相关,因为我尝试的方法之一是在异步函数之外创建一个全局变量,如下所示:
let theData = 'blank'
const getData = async function (filePath) {
fetch(filePath)
.then(response => response.text())
.then(response => {
theData = response
alert(theData)
return theData
})
}
alert(getData('./2021WeatherData.csv'))
alert(theData)
在这里,警报alert(getData('./2021WeatherData.csv'))首先弹出为“[object Promise”,然后alert(theData)提供初始化时使用的默认值“blank”,最后alert(response)在函数内提供实际文件内容。与没有全局变量的情况非常相似。我只是无法弄清楚为什么在alert(theData)通过函数完成运行并更新数据之前执行从 getData 调用向下移动到执行。
我知道我正在展示我对异步/等待、承诺等知之甚少。我只是束手无策,不知道该怎么做。先感谢您。