我有一个有效的异步功能作为主要代码(async function (){...});
,可以处理来自芦苇联系人的一些输入,并将它们发布到云中。到目前为止一切都很好。
现在,我想添加功能来分析芦苇张开的时间是否超过x秒。如果是这样,我想另外做些事情,但在此期间仍要听其他意见。所以我尝试的是:
var threshold;
async function time(threshold){
var sec = 0;
var start = new Date(); //set time stamp
while (sec < threshold){
// take actual time
var akt = new Date();
// calc difference
var diff = akt.getTime() - start.getTime();
// calc secs from mills
sec = Math.floor(diff / 1000);
}
post threshold data to cloud;
return "Threshold reached";
}
(async function () {
reading reed permanent {
if (reed === 1){
post data to cloud;
var call = time(20);
console.log(call);
}
}
})();
我不希望主函数仍然列出新的簧片变化,而time
循环应等待阈值并并行执行。
但是我的代码要等到阈值才能继续。 我该如何并行处理?
在Gibors帮助之后进行编辑:
现在,我停留在验证簧片是否仍处于打开或关闭状态的关键点。即使同时关闭簧片,我也总是得到diff > threshold
,以便时间戳记应该更新。
var id = [];
if (value['contact'] === 1) {
var bool = "false";
id[device['manufacturer']] = new Date();
} else if(value['contact'] === 0) {
var bool = "true";
id[device['manufacturer']] = new Date();
setTimeout( () => {
var akt = new Date();
var diff = akt.getTime() - id[device['manufacturer']].getTime();
if (diff > threshold) {
console.log("now: " + diff + "=" + akt.getTime() + "-" + id[device['manufacturer']].getTime());
}
}, threshold);
/*var call = time (50);
console.log(call);*/
}
```
答案 0 :(得分:1)
首先,我将解释您的代码有什么问题,然后再给您一些我认为是更好,更简单的解决方案:
您的time
函数被标记为异步,但实际上并没有执行任何异步操作。这实际上意味着,当函数“返回”时,它实际上返回了已解决的承诺。但是promise只在最后创建并立即解决,因此它不会做异步工作。
我相信这样的方法应该可行:
async function time(threshold){
return new Promise( (resolve, reject) => {
var sec = 0;
var start = new Date(); //set time stamp
while (sec < threshold){
// take actual time
var akt = new Date();
// calc difference
var diff = akt.getTime() - start.getTime();
// calc secs from mills
sec = Math.floor(diff / 1000);
}
post threshold data to cloud;
resolve("Threshold reached)";
}
}
现在这将并行运行,并且call
变量将仅在承诺被解决时获得字符串“达到阈值”-这意味着在当前代码中,您将获得的日志类似于{{1 }}。
要仅在完成时记录日志(并执行其他操作),请对Promise<pending>
持有的诺言使用.then
。
您应该注意的一件事是,您必须以某种方式在call
状态(我并没有真正得到它的真实含义,但我认为它无关紧要)和promise状态之间进行同步,因为您想在20秒结束后执行超时后代码,并且簧片仍处于打开状态,所以您必须在reed
子句中进行检查,或者将其传递给时间函数,该函数将拒绝承诺如果.then
状态在时间用完之前改变了,等等。
现在-对于简单的解决方案:在我看来,使用setTimeout函数会更好:
setTimeout()方法设置一个计时器,一旦计时器到期,该计时器将执行功能或指定的代码。
因此您可以简单地执行以下操作:
reed