2014-02-25 130 views
0

我試圖用setTimeout執行一些語句,這實際上是在getSendingJSON("/plot",args,plotReglaFalsa)問題與回調

這是回調函數執行plotReglaFalsa內執行的函數內部setTimeout函數的變量是代碼段的句子被執行通過setTimeout

for (series in respuesta) { 
       if (series != "x" && series != "y" && series != "raiz") { 

        setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500)      
        setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800) 
        c++ 
       } 
} 

這裏的問題是,respuesta等系列實際上是現有一旦回調發生。

當我嘗試運行我得到以下控制檯輸出:

TypeError: series is undefined 


...Timeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},15... 

16 
biseccion.js (line 50) 
TypeError: series is undefined 


...Timeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},18... 

這是我的全部代碼:

function plotReglaFalsa(respuesta) { 

      var result = [] 

      result.push({ 
      label: "fx", 
      color: "red", 
      data: _.zip(respuesta['x'], respuesta['y']) 
      }) 

      for (series in respuesta) { 
       if (series != "x" && series != "y" && series != "raiz") { 
        result.push({ 
         color: "blue", 
         data: [[]] 
        }) 
       } 
      } 

      var plot = $.plot( $("#placeholder"), 
           result, 
           { selection:{mode: "xy"}, 
            zoom: { interactive: true }, 
            pan: { interactive: true }, 
            grid: { markings: [{ xaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }, { yaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 2 }] } 
           }) 
      plot.getOptions().selection.mode = null 

      var c = 1 

      for (series in respuesta) { 
       if (series != "x" && series != "y" && series != "raiz") { 

        setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].a,0])},1500) 
        setTimeout(function(respuesta,series){plot.highlight(c,[respuesta[series].b,0])},1800) 
        c++ 
       } 
      } 

     } 

     getSendingJSON("/plot",args,plotReglaFalsa) 


      function resaltarPuntos(plot,respuesta,series,c,x){ 
      plot.highlight(c,[respuesta[series].x,0]) 
     } 

     function desResaltarPuntos(plot){ 
      plot.unhighlight() 
     } 

getSendingJSON實際上是AJAX。我怎樣才能完成這項工作?

+1

可能重複[臭名昭著的Javascript循環問題?(http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue) – elclanrs

+0

你傳遞你的函數'的setTimeout()' ,所以'setTimeout()'會調用它們。然而,他們不知道你想要的變量是什麼,所以他們沒有辦法將它們傳遞給函數。定義函數參數並不會以某種方式導致它們被傳遞給函數。 –

+1

[JSHint](http://jshint.com)會給你一些警告 - 「不要在循環中創建函數」 – elclanrs

回答

1

按elclanrs'評論:每次

通過for循環的代碼迭代時修改的series值。因此在調用setTimeout()時,series的值已更新爲respuesta中的最後一個值。

你需要利用關閉所以你setTimeout()使用的series的價值,因爲它是在該迭代

for (series in respuesta) { 
    if (series != "x" && series != "y" && series != "raiz") { 
     (function(x){ 
      setTimeout(function(){plot.highlight(c,[respuesta[x].a,0])},1500);      
      setTimeout(function(){plot.highlight(c,[respuesta[x].b,0])},1800); 
      c++; 
     }(series)) 
    }  
} 
+0

這隻有在您從傳遞給'setTimeout()'的匿名函數中刪除參數時纔有效。 –

+1

實際上,其目的是通過將值分配給一個不被循環更新的不同變量來避免**閉包的後果。 – RobG

+0

這就是爲什麼匿名函數接收*'x' *? – diegoaguilar