Создание массива объекта с меткой времени для выборки данных в Javascript? - PullRequest
0 голосов
/ 27 апреля 2019

Цель состоит в том, чтобы помещать выбранные данные, как объект, в массив с периодическим интервалом и ждать, пока новый массив выйдет на консоль, как только он будет завершен.

Я новичок в JS, так что успокойся;). Я, вероятно, делаю это более сложным, чем это должно быть. Думаю, это будет так же просто, как setTimeout() в цикле for.

Я смог сгенерировать массив двумя различными способами, используя 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() -ing массив, как он генерируется в функции 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 ]

1 голос
/ 27 апреля 2019

Основная идея - вернуть обещание и выполнить его, когда 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)
0 голосов
/ 28 апреля 2019

Другой способ, которым я только что начал работать с функцией генератора

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

.. с соответствующим нажатием

        arr.push(gen.next().value);
0 голосов
/ 27 апреля 2019

Я бы выделил часть задержки (асинхронную) и создал бы для этого отдельную обобщенную функцию 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);
...