2017-06-28 14 views
0

私はループを通過し、ajaxの呼び出しを送る必要がある配列を持っています。しかし、私はそれが連続的に起こることを望みます(前のことがうまくいった後に次のことをする)。これを効率的に行うにはどうすればいいですか?jQuery約束の繰り返し

$($('.logitem').get()).each(function(i,item) { 
     $.ajax({ 
     type: "POST", 
     url: 'http://localhost/save.php', 
     data: {myData: $(item).html()} 
     }); 
}); 
+0

念のため、あなたは、AJAXリクエストが唯一正常に完了し、以前のAJAX要求一度起こるしたいですか? –

+0

修正.............. – KingKongFrog

+0

どのJavascriptのバージョンをターゲットにしていますか? ES6 OK? –

答えて

2

申し訳ありませんが、このソリューションがどれほど効率的かはわかりませんが、テストからはうまくいくようです。

主な考えは、ジェネレータを使用してアイテムのリストを繰り返し処理することです。あなたはイテレータを.next()で一度起動し、あなたのajaxリクエストのcallbackから.next()を呼び出します。

$(document).ready(function() { 
 

 
    function request(item) { 
 
     $.ajax({ 
 
      type: "POST", 
 
      url: 'http://httpbin.org/post', 
 
      data: { myData: $(item).html() }, 
 
      complete: function() { 
 
       //Simulate delay in the call, remove the setTimeout in your code 
 
       setTimeout(function() { 
 
        //Once this call completes, call the next one 
 
        console.log('Call completed for item : ' + $(item).text()); 
 
        iterator.next(); 
 
       }, 1000); 
 
      } 
 
     }); 
 
    } 
 

 
    function* ajaxGenerator(items) { 
 
     for (let i = 0; i < items.length; i++) { 
 
      yield request(items[i]); 
 
     } 
 
    } 
 

 
    var logItems = $('.logitem').get(); 
 
    var iterator = ajaxGenerator(logItems); 
 

 
    //Get things started 
 
    iterator.next(); 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<!DOCTYPE html> 
 
<html dir="ltr" lang="en-US"> 
 
<head> 
 

 
    <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
 
    <title>Test</title> 
 

 
</head> 
 

 
<body> 
 

 
    <div class="logitem">Item1</div> 
 
    <div class="logitem">Item2</div> 
 
    <div class="logitem">Item3</div> 
 

 
</body> 
 
</html>