做這樣的:
代碼:
$("#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 ...
});
該代碼可以進一步改進,使每個承諾將解決其自身的價值,而沒有將產品推到一個數組,但是這是你也許可以考慮自己作爲一個練習。
通過val()返回的值總是字符串。如果你想和他們做數學,你需要讓他們成爲數字。做到這一點的方式在[這個問題的答案](https://stackoverflow.com/q/1133770/215552)中解釋。 –
在'$ .get's'中有一個異步競爭條件,它們都在同時執行。一個循環不會將它們分開。可以同時執行所有獲取,但是您需要等待所有獲取完成後數據才能「準備就緒」。閱讀一些異步和/或ajax編程教程可能會有所幫助,就像使用Promises和'Promise.all'一樣。 – Paul