Я хочу установить метку времени для каждого числа, а затем проверить метку времени каждого номера на себя.
var timestamp;
nums=["1", "2", "3"];
nums2=nums.map(myFunction);
function myFunction(num) {
setInterval(function() {
var current_time = Math.floor(Date.now() / 1000);
if (typeof timestamp !== "undefined" ) {
if (current_time > (timestamp + 60)) {
timestamp = Math.floor(Date.now() / 1000);
console.info('time stamp reset');
} else {
console.info('time stamp too young will reset after 60 sec');
}
} else {
timestamp = Math.floor(Date.now() / 1000);
console.info('time stamp set');
}
}, 10000);
}
**** Если я запускаю скрипт на 20 секунд: ****
токовый выход:
time stamp set
time stamp too young will reset after 60 sec
time stamp too young will reset after 60 sec
*(10 seconds later)*
time stamp too young will reset after 60 sec
time stamp too young will reset after 60 sec
time stamp too young will reset after 60 sec
желаемый результат:
time stamp set
time stamp set
time stamp set
*(10 seconds later)*
time stamp too young will reset after 60 sec
time stamp too young will reset after 60 sec
time stamp too young will reset after 60 sec
Вы хотите запустить сценарий дважды с интервалом в 10 секунд?
Согласен, сейчас это ничего не дает. Вы пытаетесь перейти с ["1"."2"."3"] на [["1",timestamp],["2",timestamp],["3",timestamp]] или, возможно, на [{"1",timestamp},{"2",timestamp},{"3",timestamp}]
@kemicofa Я изменил свой код, чтобы отразить результат. Я также отредактировал свой вывод.
Функцию map следует использовать только для создания второго массива преобразованных элементов. Используйте forEach для итерации.
@ThomasSablik, пожалуйста, обратитесь к моему обновленному коду.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не понимаю, что вы здесь пытаетесь сделать, поэтому мой ответ полностью основан на ваших текущий выход и желаемый результат.
Ваша переменная timestamp объявлена в области видимости global, поэтому при первом вызове myFunction ее значение будет undefined, но при последующих вызовах она будет содержать какое-то значение, что приведет к вашему «текущему выходу».
Чтобы исправить это, переместите переменную timestamp внутрь myFunction.
nums=["1", "2", "3"];
nums2=nums.map(myFunction);
function myFunction(num) {
var timestamp;
setInterval(function() {
var current_time = Math.floor(Date.now() / 1000);
if (typeof timestamp !== "undefined" ) {
if (current_time > (timestamp + 60)) {
timestamp = Math.floor(Date.now() / 1000);
console.info('time stamp reset');
} else {
console.info('time stamp too young will reset after 60 sec');
}
} else {
timestamp = Math.floor(Date.now() / 1000);
console.info('time stamp set');
}
}, 10000);
}Использование генераторов функций и setInterval
const data = [];
//populate data
for(let i = 0; i < 3; i++){data.push(i)}
function * gen(){
const timestamp = Date.now();
let currentTimestamp;
do{
currentTimestamp = yield Date.now();
}while(currentTimestamp - timestamp < 60000);
return;
}
function run(){
let iter = gen();
let t = null;
let i = 0;
const res = [];
const si = setInterval(function(){
const {done,value} = iter.next(t);
if (done){
console.info("60 seconds have gone... reseting...")
iter = gen();
//reseting
i = res.length = 0;
}
t = value;
if (i >= data.length){
console.info("waiting...");
return;
}
console.info("Set timestamp");
const d = [data[i], value];
console.info(d);
res[i++] = d;
}, 1000);
}
window.onload = run;
Я немного смущен тем, чего вы пытаетесь достичь. С учетом того, как вы это делаете сейчас, невозможно, чтобы он работал в течение 20 секунд ... потому что он будет проходить через ваш массив примерно за 1 мс ...