jQuery: зачекайте / затримте 1 секунду без виконання коду


129

Я не можу .delayзаставити метод працювати в jQuery:

$.delay(3000); // not working
$(queue).delay(3000); // not working

Я використовую цикл час, щоб зачекати, поки неконтрольоване змінне значення буде більше або дорівнює іншому, і я не можу знайти жодного способу привести в дію виконання протягом X секунд.


спробуйте використовувати setTimeout у зворотному
— дзвінку

яку версію jquery ви використовуєте?
— L7ColWinters

1
це не те, для чого призначена функція затримки, вона призначена для використання між подіями jquery в черзі (наприклад, fade (). delay (). show ()). Вам потрібна функція setTimeOut.
— JoJa

@JoJa: Ви маєте рацію в головному пункті, проте форма аргументу show (і приховування) не використовує чергу ефектів.
— Джей Томтен

3
Будь ласка, вкажіть, що ви намагаєтесь досягти із запізненням. Весь JavaScript, що виконується на одному потоці, і заморожування його протягом X секунд може спричинити несприятливий досвід користувача.
— Дмитро Шкуропацький

Відповіді:


176

$ .delay використовується для затримки анімації в черзі, а не для зупинки виконання.

Замість того, щоб використовувати цикл час, вам потрібно рекурсивно викликати метод, який здійснює перевірку щосекунди, використовуючи setTimeout:

var check = function(){
    if(condition){
        // run when condition is met
    }
    else {
        setTimeout(check, 1000); // check again in a second
    }
}

check();

1
Я думаю, setTimeout достатньо.
— Jiemurat

3
Ваш бомбо, це саме те, що мені потрібно було виправити.
— jemiloii

@Jiemurat та будь-хто інший у майбутньому: setTimeout не порушує потік виконання. Великий код Нісснера для отримання цього невдалого умови стали справжніми!
— Габрер

Якщо вам не потрібно порушувати потік виконання, ви можете просто скористатися setTimeout().
— Джошуа Пінтер

Я завжди отримую "перевірка - це не функція", хоча моя функція перевірки має два параметри
— Чорний

211

Ви також можете просто затримати деяку операцію таким чином:

setTimeout(function (){

  // Something you want delayed.

}, 5000); // How long do you want the delay to be (in milliseconds)? 

7
Просто FYI, це не порушує хід виконання, тому якщо вам потрібно "зупинити все" на кілька секунд, вам знадобиться щось на кшталт того, що написав Niessner.
— Джошуа Пінтер

Так ... його зворотний виклик функції і не блокується. Дякую за відповідь, це вирішило мою проблему.
— Бертус Крюгер

якщо частота буде надзвичайно короткою, і ми очікуємо, що ця функція буде працювати назавжди, чи зрештою вона підірве стек?
— Зайчик із самогубством

16

ES6 setTimeout

setTimeout(() => {
  console.log("we waited 204586560000 ms to run this code, oh boy wowwoowee!");
}, 204586560000);

Редагувати: 204586560000 мс - це приблизний час між початковим запитанням та цією відповіддю ... якщо припустити, що я правильно розрахував.


2
дуже приємно, використовуючи приблизний час від початкового запитання до цієї відповіді
— Fuzzybear

9

delayФункція jQuery призначена для використання з ефектами та чергами ефектів, див. delayдокументи та приклад в них:

$('#foo').slideUp(300).delay(800).fadeIn(400);

Якщо ви хочете спостерігати змінну для змін, ви можете зробити щось подібне

(function() {
    var observerInterval = setInterval(function() {
        if (/* check for changes here */) {
           clearInterval(observerInterval);
           // do something here
        }
    }, 1000);
})();

setInterval має другий обов'язковий параметр, час у мілісекундах;)
— sara_thepot

1
Дякуємо @ sara.potyscki, виправлено.
— Джуліан Д.

@JulianD. Дякую за цю пропозицію. Я приземлився над цим питанням, гуляючи за рішенням. Це саме те, що мені було потрібно для мого проекту.
— Шеріл Велес

8

JavaScript setTimeout- дуже хороше рішення:

function funcx()
   {
   // your code here
   // break out here if needed
   setTimeout(funcx, 3000);
   }

funcx();

delayФункція JQuery в основному використовується для затримки анімації в черзі анімації JQuery.


5

delay()не зупиняє потік коду, а потім повторно запускає його. Немає практичного способу зробити це в JavaScript. Все повинно бути виконано з функціями, які приймають зворотні дзвінки, такі, про setTimeoutякі згадували інші.

Мета jQuery's delay()- змусити чекати черги на анімацію перед виконанням. Так, наприклад $(element).delay(3000).fadeIn(250);, змусить елемент зникнути через 3 секунди.


5

Тільки javascript. Він буде працювати без jQuery

<!DOCTYPE html>
<html>
    <head>
        <script>
            function sleep(miliseconds) {
                var currentTime = new Date().getTime();
                while (currentTime + miliseconds >= new Date().getTime()) {
                }
            }

            function hello() {
                sleep(5000);
                alert('Hello');
            }
            function hi() {
                sleep(10000);
                alert('Hi');
            }
        </script>
    </head>
    <body>
        <a href="#" onclick="hello();">Say me hello after 5 seconds </a>
        <br>
        <a href="#" onclick="hi();">Say me hi after 10 seconds </a>


    </body>
</html>

1
Цикл чекати в JavaScript - це погана ідея! Весь функціональність javascript припиняється, коли цикл працює. Це матиме непередбачувані побічні ефекти. Набагато краще використовувати незаблокуючі функції, такі як setTimeout ().
— Кевін Г.

4

Javascript - це асинхронна мова програмування, тому ви не можете зупинити виконання на деякий час; єдиний спосіб, коли ви можете [pseudo] зупинити виконання, використовує setTimeout (), який не є затримкою, а "зворотним зворотним викликом функції".


2

Якщо ви використовуєте функції ES6 і працюєте в функції асинхронізації, ви можете ефективно зупинити виконання коду на певний час за допомогою цієї функції:

const delay = millis => new Promise((resolve, reject) => {
  setTimeout(_ => resolve(), millis)
});

Ось як ви його використовуєте:

await delay(5000);

Він зупиниться на потрібну кількість мілісекунд, але лише якщо ви працюєте в функції асинхронізації . Приклад нижче:

const myFunction = async function() {
  // first code block ...

  await delay(5000);

  // some more code, executed 5 seconds after the first code block finishes
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.