У меня есть служба Angular.js, которая дает свои результаты асинхронно, оглядываясь на некоторое время, основной шаблон для этого, похоже, использует обещания $ q, подобные этому
angular.module('fooApp').factory('foo', function ($q) {
var result;
function build() {
var d = $q.defer();
longAsyncInit(function(data) {
result = data;
d.resolve(result);
});
return d.promise;
};
return {
get: function () {
if (result) {
return $q.when(result);
} else {
return build();
}
}
}
});
Проблема в том, что у меня есть ряд сервисов, которые имеют эту службу как зависимость, а get вызывается несколько раз до того, как заканчивается первый longAsyncInit (что означает, что longAsyncInit вызывается несколько раз, каждый раз создавая новое обещание). В моем случае это неприемлемо, мне действительно нужно, чтобы longAsyncInit вызывался один раз, а не больше. В настоящее время я рассматриваю этот вопрос следующим образом
angular.module('fooApp').factory('foo', function ($q) {
var result
var d;
function build() {
d = $q.defer();
longAsyncInit(function(data) {
result = data;
d.resolve(result);
});
return d.promise;
};
return {
get: function () {
if (result) {
return $q.when(result);
} else if (d) {
return d.promise;
} else {
return build();
}
}
}
});
Это означает, что если longAsyncInit уже выполняется при вызове get(), он возвращает текущее обещание вместо создания нового и снова вызывает longAsyncInit. Это, похоже, работает, но чувствует себя неэлегантным и хрупким, есть ли лучший способ сделать это?
Вы ищете метод debounce для решения проблемы.
Из документации библиотеки Underscore, что _.debounce()
делают
Создает и возвращает новую отлаженную версию переданной функции, которая отложит ее выполнение до тех пор, пока не истечет миллисекунды ожидания с момента последнего вызова. Полезно для реализации поведения, которое должно произойти только после того, как вход остановился. Например: рендеринг предварительного комментария Markdown, пересчет макета после того, как окно перестало изменяться, и так далее.
Еще несколько объяснений Кто-нибудь может объяснить функцию "debounce" в Javascript
Некоторый контент для чтения: http://davidwalsh.name/javascript-debounce-function