将两种数组相乘
问题描述:
我想将两个数组相乘。一个数组获取值为$('#element').val();
,另一个数组获取GET请求的结果。将两种数组相乘
控制台输出:
这里是我的代码:
$("#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]
}
});
}
});
答
做这样的:
使用
let
在for
块中的变量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 ...
});
该代码可以进一步改进,使每个承诺将解决其自身的价值,而没有将产品推到一个数组,但是这是你也许可以考虑自己作为一个练习。
通过val()返回的值总是字符串。如果你想和他们做数学,你需要让他们成为数字。做到这一点的方式在[这个问题的答案](https://stackoverflow.com/q/1133770/215552)中解释。 –
在'$ .get's'中有一个异步竞争条件,它们都在同时执行。一个循环不会将它们分开。可以同时执行所有获取,但是您需要等待所有获取完成后数据才能“准备就绪”。阅读一些异步和/或ajax编程教程可能会有所帮助,就像使用Promises和'Promise.all'一样。 – Paul