我对javascript中的"debouncing"函数很感兴趣,这里写的:http://davidwalsh.name/javascript-debounce-function
不幸的是,代码没有清楚地解释清楚,让我理解.任何人都可以帮我弄清楚它是如何工作的(我在下面留下了我的评论).总之,我真的不明白这是如何工作的
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) …Run Code Online (Sandbox Code Playgroud) 我想使用Promises在AngularJS中实现动态加载静态资源.问题:我在页面上有几个组件可能(或不是,取决于哪些显示,因此是动态的)需要从服务器获取静态资源.加载后,可以在整个应用程序生命周期内进行缓存.
我已经实现了这个机制,但我是Angular和Promises的新手,我想确保这是一个正确的解决方案\方法.
var data = null;
var deferredLoadData = null;
function loadDataPromise() {
if (deferredLoadData !== null)
return deferredLoadData.promise;
deferredLoadData = $q.defer();
$http.get("data.json").then(function (res) {
data = res.data;
return deferredLoadData.resolve();
}, function (res) {
return deferredLoadData.reject();
});
return deferredLoadData.promise;
}
Run Code Online (Sandbox Code Playgroud)
因此,只发出一个请求,并且对loadDataPromise()的所有下一次调用都会获得第一个承诺.它似乎适用于进展中的请求或前一段时间已经完成的请求.
但缓存Promises是一个很好的解决方案吗?
假设我有一个承诺myProm,并说我有成功和错误处理程序调用onSuccess和onError.
每当我的诺言需要超过10秒才能完成,我想要一个timeoutHandler被执行的函数,但如果发生这种情况,既onSuccess不会也不onError应该执行.(同样,如果是onSuccess或者onError运行,我不希望我timeoutHandler被执行.)
我已经为此提出了以下代码段.
new Promise((suc, err) => {
let outOfTime = false;
const timeoutId = window.setTimeout(() => {
outOfTime = true;
timeoutHandler();
}, 10000);
myProm.then(
(...args) => {
if (!outOfTime) {
window.clearTimeout(timeoutId);
suc(...args);
}
},
(...args) => {
if (!outOfTime) {
window.clearTimeout(timeoutId);
err(...args);
}
}
);
}).then(onSuccess, onError);
Run Code Online (Sandbox Code Playgroud)
但是,如果超时,我新定义的承诺将永远悬而未决.这会产生任何负面影响吗?例如,运行时无法清除Promise对象,因为它仍处于挂起状态(或沿着这些行的某些内容).
是否可以使用 axios 自动限制所有发送到特定端点列表的请求?也许使用 axios 拦截器?
目前我限制了发送 axios 请求的用户操作,但问题是我必须在任何地方都写这个我有一个用户操作会导致一些 AJAX 请求。像这样
const throttledDismissNotification = throttle(dismissNotification, 1000)
const dismiss = (event: any) => {
throttledDismissNotification();
};
render() {
return (
<Button onClick={dismiss}>Dismiss Notification</Button>
)
}
Run Code Online (Sandbox Code Playgroud)
这会导致很多混乱,我想知道这是否可以自动化。
就像是:
if(request.url in listOfEndpointsToThrottle && request.params in cacheOfPreviousRequestsToThisEndpoint) {
StopRequest();
}
Run Code Online (Sandbox Code Playgroud)
显然这是伪代码,但你明白了。
我到目前为止看到了防抖动功能的每一个示例阻止动作的发生多次在指定的时间跨度,然后执行该操作时,在指定的时间段过后,然后复位定时器一次.例如,$mdUtil.debounceAngular Material中包含的函数.
我正在寻找的是一个debounce函数,它可以立即执行动作,然后防止后续多个动作一直触发,直到计时器重置为止.这使得用户不必等到去抖动时间已经过去直到他们采取行动同时仍然实现去除动作的目标.
有没有人见过一个或有运气创造一个?
更新了一些更多的思考后,防抖动功能,应立即再火的动作,如果去抖功能被反跳的时间跨度内再次呼吁,应该解雇行动第二次在重置定时器之前第二个电话更改的任何值.
javascript ×5
angularjs ×2
promise ×2
axios ×1
debouncing ×1
ecmascript-6 ×1
es6-promise ×1
reactjs ×1
redux-thunk ×1