我是javascript / coffeescript的新手。
有人可以解释为什么这个coffeescript / javascript通过没有延迟?
我对第一个案例的看法是,拨打updateMap(10)
,会在10秒后“安排”拨打updateMaps(9)
,并安排拨打updateMaps(8)
等等。这两个例子看起来基本相同。我错过了什么?
coffeescript:
updateMap = (numUpdates) ->
console.log("updating, numUpdates = #{numUpdates}")
if numUpdates > 0
$.getScript('/map_markers.js')
setTimeout(updateMap(numUpdates - 1) , 10000)
javascript:
updateMap = function(numUpdates) {
console.log("updating, numUpdates = " + numUpdates);
if (numUpdates > 0) {
$.getScript('/map_markers.js');
return setTimeout(updateMap(numUpdates - 1), 10000);
}
};
但是此设置有效(具有所需的延迟)。
coffeescript:
updateMap = (numUpdates) ->
count = 0
updateMapCallback = ->
count += 1
console.log("updating")
$.getScript('/map_markers.js')
setTimeout updateMapCallback, 10000 unless count < numUpdates
javascript:
updateMap = function(numUpdates) {
var count, updateMapCallback;
count = 0;
return updateMapCallback = function() {
count += 1;
console.log("updating");
$.getScript('/map_markers.js');
if (!(count < numUpdates)) {
return setTimeout(updateMapCallback, 10000);
}
};
};
答案 0 :(得分:1)
当你写:
updateMap = function(numUpdates) {
...
return setTimeout(updateMap(numUpdates - 1), 10000);
};
您正在调用 updateMap 并将返回的值传递给 setTimeout 以便稍后调用。由于函数不断调用自身,因此它将按顺序调用自身直到numUpdates - 1
为零(即 numUpdates 次)(如果 numUpdates 是小于零开始)。
在大约10秒钟内, setTimeout 将尝试调用返回的值(这是一个数字)并抛出错误 numUpdates 次(如果它没有&#t; t达到其他限制并在此期间停止。)