创建带有时间戳的对象数组以使用Javascript采样数据?

时间:2019-04-27 19:11:47

标签: javascript arrays asynchronous timestamp

目标是定期将采样数据作为对象推送到阵列上,并在完成后等待将新阵列注销到控制台。

我是JS的新手,请放轻松;)。我可能会使这变得比需要的复杂。以为它就像for循环中的setTimeout()一样简单。

使用IIFE和下面的setTimeout()setInterval(),我已经能够以两种不同的方式生成数组。不确定如何使用数组push()方法查询长度来获取异步等待功能。也许这不是一个好方法?


class Sample {
    constructor(tag, timeStamp) {
        this.tag = tag;
        this.timeStamp = Date.now();
    }
}

function arrayGenerator(tag){
    return sampleArr.push(new Sample(tag));
};

function setIntSample(callback, delay, iterations) {
    var i = 0;
    var intervalID = setInterval(function () {
       callback(i);
       if (++i === iterations) {
           clearInterval(intervalID);
       }
    }, delay);
};

以上似乎对console.log()函数生成的数组起作用,arrayGenerator()。在下面,没有骰子

function resolveAfterArrGeneration(){
    return new Promise(resolve => {
        arrLength = setIntSample(i => {arrayGenerator(i)}, 3000, 5) 
        if (arrLength === 5) {resolve();}
    });
}

async function ans() {
    var answer = await resolveAfterArrGeneration();
    console.log(sampleArr);
}
ans();

3 个答案:

答案 0 :(得分:1)

基本思想是在setInterval运行足够的迭代后返回承诺并解决承诺。您可以在单个函数中执行以下操作(使用额外的console.logs来显示该过程):

class Sample {
    constructor(tag, timeStamp) {
        this.tag = tag;
        this.timeStamp = Date.now();
    }
}

function makeSamples(iterations, delay){
    let samples = [], i = 0;
    return new Promise(resolve => {
        let intervalID = setInterval(function () {
           console.log("pushing new sample")
           samples.push(new Sample('tag: ' + i));
           if (++i === iterations) {
               console.log("finished resolving")
               clearInterval(intervalID);
               resolve(samples)
           }
        }, delay);
    })
}

makeSamples(5, 1000).then(console.log)

答案 1 :(得分:0)

我将隔离延迟部分(异步)部分,并为此创建一个单独的通用函数delay()。然后,使用async函数和for循环,剩下的所有事情就变得简单了:

const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

class Sample {
    constructor(tag, timeStamp) {
        this.tag = tag;
        this.timeStamp = Date.now();
    }
}

async function setIntSample(callback, ms, iterations) {
    const arr = [];
    for (let i = 0; i < iterations; i++) {
       if (i) await delay(ms); // don't delay first time
       arr.push(callback(i));
    }
    return arr;
}

const newSample = (tag) => new Sample(tag)

console.log("wait for it....");
setIntSample(newSample, 1000, 5).then(console.log);

答案 2 :(得分:0)

我刚开始使用生成器函数的另一种方式

function* simpleGenerator(){
    var index = 0;
    while (true)
        yield {tag: index++, time: Date.now()} 
}
var gen = simpleGenerator();

..与相应的推送

        arr.push(gen.next().value);