Как я могу предупредить асинхронную функцию о срабатывании другого экземпляра той же функции? - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу создать оповещение внутри своей функции, которое отслеживает, запускались ли какие-либо другие экземпляры той же функции в течение 15-секундного периода. это то, что у меня есть:

 bar = 0;

 async function Counting() {
   bar += 1;
   foo = bar;
   new Promise(resolve => setTimeout(resolve, 5000));
   if (bar == foo) {
     //Do something
   }
   else {
     return;
   }
 }

Я использую bar как глобальный счетчик, а foo как счетчик экземпляров функции, но по какой-то причине все экземпляры функции обновляются одновременно.

Как я могу проверить, сработала ли эта функция в течение 15-секундного периода ожидания, а затем остановить все предыдущие экземпляры функции, если это так?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Я чувствую, что ваше решение немного сложнее. Я думаю, что вы описываете отладку функций:

Это может быть немного сложнее объяснить. При использовании debouncing это похоже на «Эй, я не собираюсь выполнять эту функцию, пока не узнаю, что больше нет входящих изменений». Мы не выполняем нашу функцию до тех пор, пока все остальные не будут довольны, и мы не будем продолжать. Представьте себе заказ еды в ресторане. Вы начинаете перечислять вещи официанту / официантке, и в конце они спрашивают: «Это все?» Если это так, они оставляют вас на это и go получают вашу еду и напитки. Если это не так, вы добавляете в заказ, а затем они просят вас снова, пока они не будут ясно, чтобы продолжить - Дросселирование и дебутинг в JavaScript - Джи Томпкинс - https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf

В основном как-то так:


const fn = (() => {
  let timer = null;
  const myFn = () => {
    timer = null;
    console.log('My fn has been ran!');
  };
  return () => {
    if(timer != null){
      clearTimeout(timer);
    }
    timer = setTimeout(myFn,5000);
  };
})();  

Таким образом, когда вы звоните функция, он будет ждать 15 секунд, чтобы запустить фактическую логи c. Однако, если функция вызывается снова в течение этих 15 секунд, таймер перезапускается.

Обычно для чего-то подобного вы используете библиотечную функцию, чтобы вам не приходилось каждый раз писать весь этот шаблон:

function debounce(fn,time){
  let timer = null;
  return function(...args){
    if(timer != null){
      clearTimeout(timer);
    }
    timer = setTimeout(fn.bind(this,...args),5000);
  };
}

// Usage
const myFn = debounce((name) => {
  console.log('Hello %s!',name);
},1000);

// This function won't output "Hello !"
myFn('Joe');
// This function will
myFn('John');
0 голосов
/ 14 февраля 2020

Ранее сегодня я задал вопрос, похожий на этот, и кто-то под именем @FedericoMoretti смог мне помочь. Он предложил использовать переменные let и const, которые добились цели в моем конкретном случае c.

 let bar = 0;

 async function Counting() {
   bar += 1;
   const foo = bar;
   new Promise(resolve => setTimeout(resolve, 5000));
   if (bar == foo) {
     //Do something
   }
   else {
     return;
   }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...