2017-06-21 151 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