javascript - 使用文本文件中的数据丰富数组
问题描述
我正在尝试使用从文本文件加载的数据来丰富数组。通过第一个请求,我获得了将 URL 保存到文本文件的数据。现在,我想从该文本文件中取出第一行并将其添加到新数组中。这行得通。但是我也想添加原始请求中的数据。我似乎无法将两者结合在一起。到目前为止,这是我在代码中得到的:
var NewArray = [];
$http({
method: 'Get',
url: "https://xxx.azurewebsites.net/api/files/"
})
.success(function (data) {
for (var i = 0; i < data.length; i++) {
var x = data[i].Url;
$.when(GetFile(x))
.done(function (a1) {
var allLines = a1.split("\n");
var lineOne = allLines[0];
NewArray.push({
Name: data[i].Name,
Url: data[i].Url,
text: lineOne,
})
});
};
function GetFile(x) {
return $.ajax({
method: 'Get',
url: x,
success: function (data) {
//console.log(data);
}
});
}
console.log(NewArray);
});
我得到的错误是 TypeError: Cannot read property 'Name' of undefined。当我推送到新数组并以“未定义”结束时,它找不到 data[i].Name 和 data[i].Url 我该如何解决这个问题?
解决方案
看起来这是由于闭包和异步函数的影响,它们经常会导致类似您所面临的问题,至少在您更熟悉异步编程之前是这样。
您的for ...
循环同步运行并且非常快速,并且它将在代码中的任何异步函数实际运行之前完成对所有数据元素的迭代。该变量i
将迅速增加并命中data.length
,因此当您的异步函数尝试使用 推送新值data[i]
时,这将尝试访问data[data.length]
当然未定义的值。
有很多方法可以解决这个问题,但我建议用forEachfor ...
替换循环。这不仅与其余代码的异步特性一致,而且它还方便地提供了您想要访问的元素,而没有底层变量发生变化的风险。
由于闭包可能是一个困难的概念,您可能会喜欢这篇试图用简单的术语解释它们的博客文章。
推荐阅读
- delay - 当玩家击中立方体时,我试图延迟“重启”
- netcdf - ncdump - 如何在不包含 nodata 值的情况下将 .nc 转换为文本?
- java - RecyclerView 获取 EditText 并设置 TextView
- php - 在服务器运行项目中实施 Syncfusion 计划(Typescript)
- docker - 码头工人撰写不运行
- shell - 在 shell 脚本中组合多个命令
- karate - 调用空手道特征文件返回响应对象,包括父场景的先前响应对象的多个副本
- xml - 查找 value = X 的任何元素并报告到 root 的路径
- apache-nifi - Apache NiFi 如何检查每个处理器的输出
- google-sheets - 如果代码中有一个点,则 IMPORTXML 无法从 Yahoo Finance 获取