2013-02-18 5 views
2

у меня есть эта строка кодов

... 
$timeout(tempFunc, $scope.sync.getDelay()); 
... 

в моей функции темп у меня есть эта строка кода в конце:

$scope.sync.releasePrivilege(); 

и все работает хорошо. Однако, когда я пытаюсь:

... 
$timeout(tempFunc, $scope.sync.getDelay()); 
$scope.sync.releasePrivilege(); 
... 

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

Любые идеи?

PS: Проблема заключается в том, что:

$ scope.sync.releasePrivilege();

не работает после истечения таймаута, он сразу же запускается.

+0

Что именно "не работает"? Можете ли вы опубликовать нерабочий код в plnkr.co или jsfiddle, чтобы узнать, что не так –

+0

@ ValentynShybanov Я отредактировал свой вопрос. – kamaci

+1

Можете ли вы опубликовать пример плунжера, который показывает, что не был вызван после таймаута? –

ответ

13

$timeout - это обертка для setTimeout, которая издевается во время тестирования. @MarkRajcok совершенно прав о том, почему использование его в качестве метода блокировки не работает. Решение Mark также решит вашу проблему. Но если это нецелесообразно переместить ваш код, есть еще хорошие новости!

$timeout возвращает обещание (см $q), так что вы можете на самом деле просто цепь вместе, что вы хотите:

$timeout(tempFunc, $scope.sync.getDelay()).then(function() { 
    console.log("I'm called only after the timeout."); 
    $scope.sync.releasePrivilege(); 
}); 

console.log("But I get called immediately."); 

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

Кроме того, ваша функция может возвращать данные, если это необходимо. Так что, если tempFunc возвращается логическое значение, указанное успех, вы также можете получить доступ к нему:

$timeout(tempFunc, $scope.sync.getDelay()).then(function(result) { 
    if (result) { 
    $scope.sync.releasePrivilege(); 
    } else { 
    // handle the error 
    } 
}); 

И было много радости. Ура.


Как примечание: делать сон в браузере было бы очень плохо - он блокировал бы пользовательский интерфейс. Асинхронное выполнение - вот что делает Интернет отличной платформой!

1

Тайм-аут не обеспечивает эквивалент «сна». $ timeout помещает работу (в вашем случае tempFunc) в собственную очередь событий, и, следовательно, tempFunc будет вызван позже (после отображения браузера). $scope.sync.releasePrivilege(); будет выполняться до tempFunc. Как вы сказали, если вы хотите, чтобы releasePrivilege() выполнил после tempFunc(), вызовите tempFunc().

+0

Думаю, у вас есть идея о том, что я прошу. Есть ли другой способ его достижения? – kamaci

+0

Я так не думаю: http://stackoverflow.com/questions/951021/what-do-i-do-if-i-want-a-javascript-version-of-sleep –

+0

Должен ли я использовать setTimeout или $ таймаут делает то же самое? – kamaci

Смежные вопросы