2017-06-21 208 views
-2

我想將兩個數組相乘。一個數組獲取值爲$('#element').val();,另一個數組獲取GET請求的結果。將兩種數組相乘

控制檯輸出:

enter image description here

這裏是我的代碼:

$("#sendeS1").click(function() { 
 
    var i = 1; 
 
    var Q_Values = []; 
 
    var G_Values = []; 
 
    var R_Values = []; 
 

 
    for (i; i <= 20; i++) { 
 
    $.get("bewertung/get/weight/" + i, function(weight) { 
 
     Q_Values[i - 1] = $('#startup_1').find('.' + i).val(); 
 
     G_Values[i - 1] = weight; 
 
     R_Values[i - 1] = Q_Values[i - 1] * G_Values[i - 1]; 
 
     console.log("Q:" + Q_Values); 
 
     console.log("G:" + G_Values); 
 
     console.log("R:" + R_Values); 
 
    }); 
 

 
    $.ajax({ 
 
     url: '/bewertung/1', 
 
     type: 'POST', 
 
     data: { 
 
     startup_id: '1', 
 
     user_id: localStorage.getItem("userid"), 
 
     question_id: i, 
 
     wert: G_Values[i - 1] 
 
     } 
 
    }); 
 
    } 
 
});

+0

通過val()返回的值總是字符串。如果你想和他們做數學,你需要讓他們成爲數字。做到這一點的方式在[這個問題的答案](https://stackoverflow.com/q/1133770/215552)中解釋。 –

+0

在'$ .get's'中有一個異步競爭條件,它們都在同時執行。一個循環不會將它們分開。可以同時執行所有獲取,但是您需要等待所有獲取完成後數據才能「準備就緒」。閱讀一些異步和/或ajax編程教程可能會有所幫助,就像使用Promises和'Promise.all'一樣。 – Paul

回答

1

做這樣的:

  • 使用letfor塊中的變量i,所以當循環已完成了仍然可以參考一個獨立的變量,你只能再從get電話得到答覆

  • 使用+到轉換val()了一些(雖然你的情況不是絕對必要的,因爲與即時的轉換倍增)

代碼:

$("#sendeS1").click(function() { 
    var Q_Values = []; 
    var G_Values = []; 
    var R_Values = []; 

    for(let i = 1; i <= 20; i++){ 
     $.get("bewertung/get/weight/"+i, function (weight) { 
      Q_Values[i-1] = +$('#startup_1').find('.'+i).val(); 
      G_Values[i-1] = weight; 
      R_Values[i-1] = Q_Values[i-1] * G_Values[i-1]; 
      console.log("Q:"+Q_Values); 
      console.log("G:"+G_Values); 
      console.log("R:"+R_Values); 
     }); 
     //...etc 

警告:當for循環完成時,數組還沒有值,所以不要假設您在循環之後擁有所有數據。請參閱How do I return the response from an asynchronous call?以解決這個問題。這是不是最好的代碼

的一種方式,但最簡單的理解,就是用倒計時,讓你知道當你把所有的數據,然後調用一個函數,將做進一步的處理:

$("#sendeS1").click(function() { 
    var Q_Values = []; 
    var G_Values = []; 
    var R_Values = []; 
    var countDown = 20; 

    for(let i = 1; i <= 20; i++){ 
     $.get("bewertung/get/weight/"+i, function (weight) { 
      Q_Values[i-1] = +$('#startup_1').find('.'+i).val(); 
      G_Values[i-1] = weight; 
      R_Values[i-1] = Q_Values[i-1] * G_Values[i-1]; 
      console.log("Q:"+Q_Values); 
      console.log("G:"+G_Values); 
      console.log("R:"+R_Values); 
      countDown--; 
      if (countDown == 0) processResults(Q_Values, G_Values, R_Values); 
     }); 
     //...etc 

但我真的建議查看承諾。這真的是要走的路。幸運的是,jQuery $.get返回一個承諾,這些承諾可以傳遞給$.when,當所有這些承諾都滿足時,這將會調用它的then方法。 (另請參閱What does $.when.apply($, someArray) do?)。

$("#sendeS1").click(function() { 
    var Q_Values = []; 
    var G_Values = []; 
    var R_Values = []; 
    var promises = []; 

    for(let i = 1; i <= 20; i++){ 
     promises.push($.get("bewertung/get/weight/"+i, function (weight) { 
      Q_Values[i-1] = +$('#startup_1').find('.'+i).val(); 
      G_Values[i-1] = weight; 
      R_Values[i-1] = Q_Values[i-1] * G_Values[i-1]; 
      console.log("Q:"+Q_Values); 
      console.log("G:"+G_Values); 
      console.log("R:"+R_Values); 
     })); 
     //...etc 
    } 
    $.when.apply($, promises).then(function() { 
     // all is done, process the results here ... 
    }); 

該代碼可以進一步改進,使每個承諾將解決其自身的價值,而沒有將產品推到一個數組,但是這是你也許可以考慮自己作爲一個練習。

+0

異步競爭情況如何?如圖所示,這並不算太壞,但如果他想要將這些陣列用於任何重要的事情,他需要知道陣列是否「準備就緒」。他的發佈代碼並沒有這樣做。 – Paul

+0

確實這也是一個問題。但是由於這個問題沒有涉及...我在最後加了一個警告。 – trincot

+0

這可以完成這項工作。謝謝trincot!但現在異步比賽是痛苦。你有這個快速解決方案嗎?我正在努力瞭解您的鏈接。 – Aleks