jQuery帖子 - 等待回复

时间:2017-11-25 17:28:30

标签: javascript jquery post

我在循环中使用基本的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作为参数,任何想法传递?

3 个答案:

答案 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当前值应用(绑定)到内部函数时的快照。