【发布时间】:2018-10-13 20:42:23
【问题描述】:
我一直试图让这段代码工作一段时间,但我似乎无法得到它。它用于实时更新图,它为每个点接收一个 [x, y] 数组,因此是一个数组数组。
输入是来自服务器的JSON 列表,它更新相同的JSON 对象(因此它更改了一个JSON 并仅更新值):
[
{
"Value": 10,
"Name": "Name of variable"
}
]
我只需要提取值。
我试过这样:
var getValueData = async function() {
var valueJSON = await Promise.resolve($.getJSON( "{% url 'get_value' %}" ));
return valueJSON[0]['Value'];
};
var data = [];
var totalPoints = 100;
var updateInterval = 1000;
var now = new Date().getTime();
function getData() {
data.shift();
while (data.length < totalPoints) {
var value = [now += updateInterval,
getValueData().then(function(result) {
result;
})
];
data.push(value);
};
};
基本上,getData() 正在尝试从JSON 构建X = timestamp.now() 和Y = "Value" 的数组,然后将该数组推送到我的"overall" 数据数组中。
这样做会使value 成为[<timestamp>, Unresolved] 的数组。
这样做:
while (data.length < totalPoints) {
getZScoreData().then(function (result) {
var valueArray = [now += updateInterval, result];
data.push(valueArray);
});
};
使valueArray 成为实际的[<timestamp>, <JSON "value"],如果我console.log(value),除了这种方式似乎永远挂起服务器并为选项卡消耗大量RAM,就好像我在做一个无限循环(数百对 Web 服务器的获取请求,即使最大长度应为 100)。不过,我不确定 Promise 内部发生了什么来获得这种行为。
这是示例中的代码:
while (data.length < totalPoints) {
var y = Math.random() * 100;
var value = [now += updateInterval, y];
data.push(value);
};
看起来很简单。它说 y(在var value = [now += updateInterval, y]; 中)使“y”从我的 API 中获取值。
我不知道如何实际实现这一点。
我正在关注this Flot example 中的示例,但我无法使其与来自 AJAX 或 Promise 的实际实时值一起工作(我什至尝试过 fetch)。
“实时更新表”的所有示例最终都只使用math.random(),这很容易引起误解,因为它只是在移动,但并不是真正的实时。
我相信我没有正确解决循环中的承诺,但由于缺乏经验,在这一点上我什至不确定出了什么问题。
我不确定我将在我的代码中的哪个位置Y = "live value",或者我是否必须在某个地方返回结果?我对 Promises 或 AJAX 不太熟悉。
【问题讨论】:
-
您遇到了什么错误?请完成完整的调试
-
getValueData() 正在返回一个常量,所以我相信你不能这样做
getValueData().then()。 -
@Frondor 没有错误,它只是没有显示任何内容,因为数组的“y”值只是一个 Promise(未解析)对象,因此图形库不知道要做什么做它。我根本没有得到图表(预期)。如果我尝试使用挂起服务器的方法,我没有得到任何响应,它只是不断向服务器发送 get 请求。
-
Promise 是功能性的,它们不能很好地与循环相处。 Promise 已经有一些工具,如
Promise.all()、Promise.race()或 dynamic sequential execution of promises 来处理您对重复出现的异步案例的需求。如果您喜欢循环,那么您应该研究async-await抽象。
标签: javascript arrays get promise flot