Adan
Adan

Reputation: 15

How to delay part of a function?

I would like to execute half of the a function and wait 1 second or 2 and then execute the rest, I tried like this, but I don't understand how to put a function inside another.

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

    $('#music_action').click(function() {

      if($(menu_start_animation).hasClass('menu_start_animation')) {
        $(menu_start_animation).removeClass('menu_start_animation');
        $(menu_start_animation).addClass('favorites_back_animation');
        await sleep(2000);
        $(menu_start_animation).removeClass('favorites_back_animation');
        $(menu_start_animation).addClass('music_animation');
      }

    });

Upvotes: 0

Views: 166

Answers (2)

Hackstreet_Boy
Hackstreet_Boy

Reputation: 41

If you want to accomplish this using await, you should to make the function asynchronous or it will throw a syntax error, await wont work using regular functions. Here is an example of how to accomplish what you're trying to do asynchronously.

sleep = async (ms) => {
  await new Promise((resolve, reject) => setTimeout(resolve, ms));
}

onClick = async () => {
  console.log('first task')

  // wait 2 seconds
  await sleep(2000);

  console.log('second task')
} 

onClick()

However, for this use case you might not need to accomplish this asynchronously. Using setTimeout() seems async, but it runs concurrently in the background and uses less memory - asynchronous functions break a synchronous flow, but they don't necessarily execute in a concurrent order. In your case, it might be best to use a callback function.

 /** 
  *  Basic example updating a string
  *  In your case, the callback function would be adding and removing whatever you 
  *  needed to in the second half of your function
  */
 let word = 'init'

 function sleep (callback, ms) {
   setTimeout( () => {
     word = 'updatedWord'
     callback()
   }, ms)
 }

 sleep(function () {
   alert(word)
 }, 2000)

Upvotes: 0

James Monger
James Monger

Reputation: 10665

You just need to make your click callback async.

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

$('#music_action').click(async function () {
    if ($(menu_start_animation).hasClass('menu_start_animation')) {
        $(menu_start_animation).removeClass('menu_start_animation');
        $(menu_start_animation).addClass('favorites_back_animation');

        await sleep(2000);

        $(menu_start_animation).removeClass('favorites_back_animation');
        $(menu_start_animation).addClass('music_animation');
    }
});

Upvotes: 1

Related Questions