2017-01-01 154 views
1

我知道這個問題已被多次詢問(是的,我做了一些研究),但我看不到找到適合我需求的解決方案。將指針/參考傳遞給變量作爲參數

我迄今所做的:

我是構建跟蹤的用戶有多遠向下滾動頁面的百分比,並很好地顯示到一些進度此功能。這很有效,但是當我在Chrome上打開開發者控制檯並查看時間軸選項卡時(這顯示了正在運行的圖形),我意識到我的代碼非常「活躍」。它運行用戶向下滾動頁面的每個像素,這是非常誠實的。

所以我想,我怎麼能改善這個問題,並且我已經想出了一個解決方案,只需要在任何毫秒內執行一次函數。如果該函數已經在{whatever}毫秒中執行過,那麼這涉及一個設置爲true或false的變量。

我想要完成的任務:

我希望能夠設置爲,將作爲一個標誌,以確定是否該功能已經被執行或沒有外部變量的引用。

function qeue(fn, interval, status){ // this function name might not be very fitting.. 
    // fn = function to be executed 
    // interval = function can only run once between the intervals 

    // status = tricky part.. 
    // This should contain a reference to an external variable that is either true or false 
} 

這是如何實現的?

側面說明

如果這種解釋是沒有幫助的,你仍然沒有得到我想要的:

如何傳遞給一個變量的引用到一個函數,所以函數可以基於該變量的值來操作?

爲什麼正常參數是不是一個選項 我要實現某種類型的函數內部遞歸setTimeout的功能,來檢查,如果另一個功能已被執行或者不執行,如果我通過這一個參數,這參數在過程中不能改變。

希望你們能幫助我!

謝謝

謝謝你的所有偉大的答案。你讓我學習了很多。我正在採取去抖策略!我標記T.J. Crowder是最好的答案,因爲這是一個很好的解釋,也是第一個答案。但是再次感謝你們!

+2

http://stackoverflow.com/a/4298672 – Teemu

+0

你可以瀑布的承諾,所以你可以在每個進一步的settimeout調用中使用最後的結果。檢查這篇文章https://remysharp.com/2015/12/18/promise-waterfall/#comment-3076688933 – Sebas

回答

2

什麼你所描述想要做不會立即說:「使用一個變量的引用」對我來說(如Teemu指出,聽起來好像要debouncing)但回答你關於變量引用的問題......

JavaScript沒有任何形式的引用變量(不是通過關閉其他,這可能是有問題的在這裏)。但是,只要使用一個對象並使用一個屬性,就可以輕鬆地完成所談論的內容。該房產是「可變」。

簡單的例子:

function foo(obj) { 
 
    var counter = 0; 
 
    var timer = setInterval(function() { 
 
    console.log("foo: " + obj.property); 
 
    if (++counter === 5) { 
 
     clearInterval(timer); 
 
    } 
 
    }, 500); 
 
} 
 

 
var o = {property: "unchanged"}; 
 
// Give the "reference" to `property` to `foo`: 
 
foo(o); 
 

 
// Update it periodically while `foo` is doing its asynchronous thing 
 
setTimeout(function() { 
 
    o.property = "update 1"; 
 
}, 1000); 
 
setTimeout(function() { 
 
    o.property = "update 2"; 
 
}, 1700);

+0

謝謝!這是我將要使用的。 –

0

爲什麼你不使用setInterval函數,它會做你想要的。

例子:

setInterval(function() { 
    // logic to be implemented 
}, delayInMilliseconds) 
0

這又如何實現呢?

不具有可變。 JS中沒有「引用變量」。我可以看到兩個簡單的解決方案:

  1. 通過一個getter/setter函數:

    function queue(getStatus) { 
        … 
        getStatus() // gets current value 
        … 
    } 
    
    var executed = false; 
    queue(function() { return executed; }); 
    
  2. 通過與屬性的對象:

    function queue(status) { 
        … 
        status.executed // gets current value 
        … 
    } 
    
    var status = {executed: false}; 
    queue(status); 
    

我有想出一個解決方案,只需要每個{無論} millisecon執行一次函數DS。如果該函數已經在{whatever}毫秒中執行過,那麼這涉及一個設置爲true或false的變量。

我看不到爲什麼這個變量需要是函數的參數,並且可以在外面使用(甚至可以設置?)。只需使用queue內的局部變量即可。

順便說一句,這個功能被稱爲反彈,你不必自己寫這個。許多實現已經可以在網上找到,有時候也可以作爲大型圖書館的一部分。例如參見What does _.debounce do?

2

在JavaScript中的值,如整數,字符串,等等都由值傳遞。如果你想傳遞一個引用,你必須傳入一個對象到JavaScript函數中。 (JavaScript對象是通過引用傳遞)

function adjustValues(referenceObject) { 
    referenceObject.foo = 2; 
    referenceObject.bar = "newValue"; 
} 

referenceObject = { 
    foo: 1, 
    bar: "initialValue" 
}; 

adjustValues(referenceObject); 
0

試試下面的例子:

'use strict'; 
 

 
var observable = 0; 
 

 
function incObservable() { 
 
\t ++observable; 
 
\t console.log('incObservable observable: '+observable); 
 
} 
 
function observe() { 
 
\t console.log('observe observable: '+observable); 
 
} 
 

 
var observer = setInterval(observe, 100); 
 

 
setTimeout(function() { 
 
\t incObservable(); 
 
\t setTimeout(function() { 
 
\t \t incObservable(); 
 
\t \t setTimeout(function() { 
 
\t \t \t incObservable(); 
 
\t \t }, 300); 
 
\t }, 300); 
 
}, 300); 
 

 
setTimeout(function() { 
 
\t // Stop obsever 
 
\t clearInterval(observer); 
 
}, 1000); 
 

 
// observe observable: 0 
 
// observe observable: 0 
 
// incObservable observable: 1 
 
// observe observable: 1 
 
// observe observable: 1 
 
// observe observable: 1 
 
// incObservable observable: 2 
 
// observe observable: 2 
 
// observe observable: 2 
 
// observe observable: 2 
 
// incObservable observable: 3 
 
// observe observable: 3