如何延迟部分功能?

时间:2019-04-24 17:08:31

标签: javascript function delay wait pause

我想执行a函数的一半,然后等待1秒钟或2秒,然后再执行其余部分,我试图这样做,但是我不知道如何将一个函数放到另一个函数中。

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');
      }

    });

2 个答案:

答案 0 :(得分:1)

您只需要进行click回调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');
    }
});

答案 1 :(得分:0)

如果要使用await完成此操作,则应使该函数异步进行,否则它将引发语法错误,await无法使用常规函数工作。这是一个有关如何异步完成您的尝试的示例。

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()

但是,对于此用例,您可能不需要异步完成此操作。使用setTimeout()似乎是异步的,但是它在后台并发运行并且使用更少的内存-异步函数破坏了同步流,但不一定按并发顺序执行。在您的情况下,最好使用回调函数。

 /** 
  *  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)