javascript - 使用 JSON 循环访问 URL
问题描述
我创建了一个页面来读取来自 EA 洪水监测站的遥测数据。它可以工作,但站结果按随机顺序排序,重要的是它们按与上游级别数组相同的顺序排序。我错过了什么?
function getLevels() {
var upstreamLevels = new Array("L1206", "L1203", "L1202", "L1108", "L1103", "L1308");
var measuresTable = "";
var label = "";
for (x = 0; x < upstreamLevels.length; x++) {
$.getJSON("https://environment.data.gov.uk/flood-monitoring/id/measures/" + upstreamLevels[x] + "-level-stage-i-15_min-m/readings?_view=full&_sorted&_limit=3", function(json) {
label = json["items"][0]["measure"]["station"]["label"];
measuresTable = measuresTable + '<p>Station Name ' + label + '</div>';
$("#measures").html(measuresTable);
});
}
}
window.onload = getLevels();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<div id="measures"></div>
解决方案
欢迎来到异步编程世界。
$.getJSON function
是一个异步函数,当它从服务器获取数据并且网络请求可以按任意顺序完成时,它将调用您的回调,这意味着第一个请求可以在最后一个请求之后完成。
因此,要以与 dom 相同的顺序获取数据upstreamLevels
,您可以等待请求完成并相应安排(就像我使用Promise.all所做的那样)或编写自定义逻辑以从数组索引更新 dom,例如,将结果推送到新数组,与 相同的索引upstreamLevels
,并通过循环遍历结果数组来更新 dom。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<div id="measures">loading...</div>
<script>
function getLevels() {
var upstreamLevels = new Array("L1206", "L1203", "L1202", "L1108", "L1103", "L1308");
var measuresTable = "";
var label ="";
function httpGet(url) {
return new Promise(function (resolve, reject) {
return $.getJSON(url, resolve)
});
}
var promises = upstreamLevels.map(function(u) {
return httpGet("https://environment.data.gov.uk/flood-monitoring/id/measures/"+u+"-level-stage-i-15_min-m/readings?_view=full&_sorted&_limit=3")
})
Promise.all(promises)
.then(function(promiseResp) {
promiseResp.forEach( function(json) {
label = json["items"][0]["measure"]["station"]["label"];
measuresTable = measuresTable + '<p>Station Name ' + label + '</div>';
$("#measures").html(measuresTable);
})
})
}
window.onload = getLevels();
</script>
您可以使用fetch而不是 $.getJSON,它的使用承诺。您可以使用反引号来构建字符串。
例如
`https://environment.data.gov.uk/flood-monitoring/id/measures/"${upstreamLevel}+"-level-stage-i-15_min-m/readings?_view=full&_sorted&_limit=3`
和
measuresTable = ${measuresTable<p>Station Name ${label}</div>
推荐阅读
- c# - 使用 OpenXML 在数据集中导入 excel 时,“对象引用未设置为对象的实例”
- json - 无法执行语句;嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法执行语句
- python - 'int' 和 'str' 的实例之间不支持 '<' 甚至不知道输出必须是什么
- c# - 删除或隐藏gridview winfrom中的垂直滚动条
- yaml - 如何在 Swagger API 中描述嵌套对象?
- ios - Swift - 以编程方式创建 UIPickerView
- c# - MySQL SELECT 命令拒绝用户 - MySql.Data.EntityFrameworkCore
- c# - C# Cake NuGet 许可证验证程序
- ruby-on-rails - 让 Rails 控制台与多个 Gemfile 一起工作
- node.js - 如何在 ssh2 库的帮助下创建一个到 postgres 服务器的 SSH 并使用 pg 库进行查询?