JQuery .post()在.each函数中使变量具有相同的值

时间:2017-12-20 07:41:57

标签: javascript jquery

我只是对这个问题感到困惑。我的变量值存在问题,$.post函数内部的函数与父函数$(element).each(function不同,这里是我的代码:



$(document).ready(function() {
  $(".list").each(function() {
    var a = $(this).find("input.input-text").val();
    console.log(a);
    $.post("/Somewhere/path/").done(function(e) {
      console.log(a);
    });
  });
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="list"><input type="text" class="input-text" value="30000"></div>
<div class="list"><input type="text" class="input-text" value="20000"></div>
<div class="list"><input type="text" class="input-text" value="10000"></div>
&#13;
&#13;
&#13;

通常会显示每个函数中a变量的值,如

30000 20000 10000

a函数中$.post变量的值返回的值与

相同

10000 10000 10000

我在a函数中找到了声明$.post变量的替代方法,但还有其他解决方案吗?

3 个答案:

答案 0 :(得分:1)

你需要这样做

&#13;
&#13;
function callerFunction(a) {
    $.post("/Somewhere/path/").done(function(e) {
      console.log(a);
    });
}

$(document).ready(function() {
  $(".list").each(function() {
    var a = $(this).find("input.input-text").val();
    callerFunction(a);
  });
});
&#13;
&#13;
&#13;

或者您必须像这样同步拨打电话

function callerFunction(lists, index) {  
  if(lists.length > index) {
      var a = $(lists[index]).find("input.input-text").val();
      $.post("/Somewhere/path/").done(function(e) {
        console.log(a);
        callerFunction(lists, index+1);
      });
   }
}

$(document).ready(function() {
    var lists = $(".list");
    callerFunction(lists, 0);
});

答案 1 :(得分:1)

您遇到的麻烦是由于Javascript的异步性质。 $ .post调用无法以同步方式工作,因此所有闭包(您输入$.post().done()的功能)将在网络请求完成后工作。

为了更好地理解,请检查下面的小提琴。它通常将-1​​000,-1000,-1000记录到控制台但它仍然取决于网络请求的响应时间。

然后要解决这个问题,您可以将$.post调用移动到另一个函数(它创建新范围),或者同步调用而不是异步调用。

$(document).ready(function(){
$(".list").each(function(){
var a = $(this).find("input.input-text").val();
	$.get('/echo/js/?js=hello%20world!').done(function(e){
		console.info(a);
	});
	a = -1000;
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="list"><input type="text" class="input-text" value="30000"></div>
<div class="list"><input type="text" class="input-text" value="20000"></div>
<div class="list"><input type="text" class="input-text" value="10000"></div>

答案 2 :(得分:0)

你的代码对我有用,我只需要为post函数添加一个“真正的”路径

$(document).ready(function() {
  $(".list").each(function() {
    var a = $(this).find("input.input-text").val();
    console.log(a);
    $.post("/echo/json/").done(function(e) {
      console.log(a);
    });
  });
});

也许有帮助:jsfiddle

输出:

(index):49 30000
(index):49 20000
(index):49 10000
(index):51 30000
(index):51 20000
(index):51 10000