2017-11-25 317 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當前值的快照。