javascript setTimeout混乱

时间:2014-06-13 04:39:50

标签: javascript coffeescript

我是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);
      }
    };
  };

1 个答案:

答案 0 :(得分:1)

当你写:

updateMap = function(numUpdates) {
        ...
                return setTimeout(updateMap(numUpdates - 1), 10000);
      };

您正在调用 updateMap 并将返回的值传递给 setTimeout 以便稍后调用。由于函数不断调用自身,因此它将按顺序调用自身直到numUpdates - 1为零(即 numUpdates 次)(如果 numUpdates 是小于零开始)。

在大约10秒钟内, setTimeout 将尝试调用返回的值(这是一个数字)并抛出错误 numUpdates 次(如果它没有&#t; t达到其他限制并在此期间停止。)