2017-03-17 154 views
0

這是一個棘手的問題。是否可以批量調用函數而不等待事件循環的下一個滴答聲?批處理功能同步?

爲簡單起見的例子。

let numbers = [] 
let total = 0 

const addNumber = (num) => { 
    numbers.push(num) 
    compute() 
} 

// for the sake of this argument let's say compute is very expensive to run 

const compute =() => { 
    numbers.forEach((num) => { 
    total += num 
    }) 
    numbers = [] 
} 

這是目前發生的情況。 compute每隔addNumber後運行,因爲我們需要同步計算總數。

這是我們需要工作的例子。我們只能撥打addNumber,我們不能直接撥打compute。有沒有辦法改變addNumber,所以這個例子可以工作,但只調用compute一次?

addNumber(2) 
addNumber(4) 
addNumber(10) 
console.log(total === 16) // needs to be true 

感謝您的幫助!

+0

爲什麼不能直接調用'compute'? – Jerfov2

+0

_「我們只能調用addNumber,我們不能直接調用compute。」_ - 爲什麼會這樣呢? – Joseph

+0

在這個例子中,我沒有任何意義,但在實際使用中,addNumber是在一個特殊的上下文中執行的,這個上下文有一個需要以這種方式工作的約束。只有'addNumber'或者它的某個版本才能訪問'compute'。 – boom

回答

0

不,我建議移動compute函數的位置,以便在需要檢索它之前計算total的值。

我能想到的任何其他選項都會帶來某種異步功能,這是您所說的不想要的。

+0

我認爲這是事實。因爲我知道無法期待事件循環中的下一個事件是什麼,這基本上是我認爲需要發生的事情。 – boom

+0

我的第一個建議不是一個選項嗎?你能不能在你需要之前將計算功能移動到? – Aron

+0

基本上,需要通過'addNumber'或其他你需要傳遞標誌來運行compute的東西。它會工作,但不符合設計指南。 – boom