我在循环中使用基本的jQuery帖子请求。
for (i = 1; i < 2; i++) {
for (ii = 0; ii < 2; ii++) {
$.post( "url", 'some data')
.done(function( data ) {
if(data.length > 2){
$("#datagot").append(ii);
}
});
}
}
我需要将ii变量传递给.done函数,但脚本不会等到请求完成,因此每个请求的ii都不正确。
我怎样才能实现这一目标?有没有办法将ii作为参数,任何想法传递?
答案 0 :(得分:1)
我认为这是错误的方法,从你的代码你正在做2个帖子,每个ii从0到2,所以0和1所以两个ajax调用,你需要延迟对象所以这样的事情,如果他们是异步
$.when(callOne(),callTwo()).then(function(answerOne,answerTwo){
if (answerOne == 'answerOneReturned' && answerTwo =='answerTwoReturned'){
$("#datagot").append(answerOne);
$("#datagot").append(answerTwo);
}
});
function callOne(){
return $.ajax({
url:'myUrl.php',
type:'POST',
dataType:'html'
}).then(function(data) {
if (data == 'something'){
myAnswer = 'answerOneReturned';
}
return myAnswer;
});
}
function callTwo(){
return $.ajax({
url:'myUrl.php',
type:'POST',
dataType:'html'
}).then(function(data) {
if (data == 'something'){
myAnswerTwo = 'answerTwoReturned';
}
return myAnswerTwo;
});
}
如果它们是同步的,那么上面的函数相同,但你必须使用这个函数来同步
$.when(callOne()).then(function(answerOne){
if (answerOne== 'answerOneReturned'){
return callTwo();
}
}).then(function(answerTwo){
if (answerTwo== 'answerTwoReturned'){
//Do append
}
});
必须确切地说延迟对象允许这样做,例如,10异步调用ajax但处理所有答案并指向你想要的地方...所以如果anwserOne是A而answerTwo是B,那么在answerOne中做一件事就是C并且回答两个ID D做另一件事......等等......等等。
抱歉,这意味着什么?
for (i = 1; i < 2; i++) {
没有必要为i = 1和次要或2?没有必要......
答案 1 :(得分:0)
没有。 for循环是同步的,这意味着在ii = 0时,$ .post将运行。运行$ .post后,ii = 1将发生,并且$ .post将运行。
ii = 0的.done可能在2分钟后发生,而ii = 1的.done可能在此之前1分钟发生,反之亦然,例如。您无法知道首先出现哪个 .done,或 时出现。
To&#34;知道&#34;哪个ii已经完成.done,你需要在$ .post数据中传递ii的值,并让它返回。返回数组是一种简单的方法。例如:
.done(function( data ) {
let dataii = data[0];
let datagot = data[1];
if(datagot.length > 2){
$("#datagot").append(dataii);
}
}
答案 2 :(得分:0)
两个简单的解决方案:
1)使用let ii = 0
。由于使用let
声明的变量仅存在于声明它们的块的上下文中,因此将为循环的每次迭代重新创建ii
。因此循环的后续迭代不会改变它的值,而是作用于它们自己的ii
副本:
for (let ii = 0; ii < 2; ii++) {
...
}
2)使用partial application。只需使用Function.prototype.bind()
来应用done
处理程序的第一个参数:
$.post( "url", 'some data')
.done(function(ii, data) {
...
}.bind(null, ii)) // add this
这将有效地创建ii
当前值应用(绑定)到内部函数时的快照。