我只是对这个问题感到困惑。我的变量值存在问题,$.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;
通常会显示每个函数中a
变量的值,如
30000
20000
10000
但a
函数中$.post
变量的值返回的值与
10000
10000
10000
我在a
函数中找到了声明$.post
变量的替代方法,但还有其他解决方案吗?
答案 0 :(得分:1)
你需要这样做
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;
或者您必须像这样同步拨打电话
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()
的功能)将在网络请求完成后工作。
为了更好地理解,请检查下面的小提琴。它通常将-1000,-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