在一些地方,我們必須只有一個功能運行的實例。信號量,run_once裝飾器,或類似的東西
此代碼的工作對我來說:
function example() {
var that = this;
if(that.running) {
return false;
}
that.running = true;
$.get(url, {}, function (data) {
that.running = false;
});
}
我們如何能夠改善它,並使它更具重用性?
UPD這裏是解決方案的基礎上,弗裏茨麪包車坎彭答案:
function make_run_once(callback) {
callback.running = false;
return function() {
if(callback.running) {
return false;
}
callback.running = true;
deferred = $.Deferred();
deferred.done(function() {
callback.running = false;
});
callback(deferred); // pass deferred to callback so it can resolve at it's own leisure
};
}
你的目標是真的有**功能**只運行一次,或者你是否試圖阻止來自同一個對象的多個Ajax **請求? –
你基本上使用this.running。這並不一定意味着你有一個正在運行的函數實例,每個實例只有一個實例。如果總共只需要一個實例,那麼使用example.running(如果示例是頂層函數而不是內部函數)或window.running(儘管如此,儘量避免命名衝突)。 –
@Chris,實際上,我有計算,這是前後ajax調用,所以我想阻止整個函數運行。同時也阻止可能的答案 - 我不'異步:false':) –