2017-11-25 319 views
1

我在循环中使用基本的jQuery post请求。jQuery post - 等待响应

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作为参数,任何想法?

+0

你可以尝试总是而不是完成.. –

回答

0

否for循环是同步的,这意味着在ii = 0时,$ .post将运行。只要运行$ .post,ii = 1就会发生,$ .post就会运行。

ii = 0的.done可能在2分钟后出现,ii = 1的done可能在1分钟前出现,反之亦然。你不可能知道其中 .done会先发生,或者它们会发生。

要“知道”完成了.done中的哪个ii,您需要将$ ii的值传递给$ .post数据,并将其返回。返回数组是一种简单的方法。例如:

.done(function(data) { 
    let dataii = data[0]; 
    let datagot = data[1]; 

    if(datagot.length > 2){ 
    $("#datagot").append(dataii); 
    } 
} 
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; 
    }); 
} 

同样功能的事情上面,如果他们是同步的,但你必须使用此书面syncronous

$.when(callOne()).then(function(answerOne){ 
    if (answerOne== 'answerOneReturned'){ 
     return callTwo(); 
    } 

}).then(function(answerTwo){ 
    if (answerTwo== 'answerTwoReturned'){ 
     //Do append 
    } 

}); 

必由之路精确的递延对象允许做,例如,10 ajax调用异步,但处理所有的答案,并指挥你想要的地方...所以如果anwserOne是A和answerTwo是B做答案中的一件事是C和answerTwo ID D做另一件事.... ....等..等等......

对不起,但这是什么意思? ?

for (i = 1; i < 2; i++) { 

这是没有必要对于i = 1和轻微或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当前值的快照。