みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

jQueryでarrayに対し$.ajax()を非同期直列で呼び出す

$.ajax()を使ってarrayに格納された複数のurlを順番に取得していく方法です.

var urls = ["909253","909254","909255","909256"];
urls.reduce(function(previous,current) {
  return previous.then(function(response) {
    if (response) {
      console.log(response);
    };
    console.log(current);
    return $.ajax({
      url: "https://itunes.apple.com/lookup?id="+current,
      timeout: 2000
    });
  });
}, $.Deferred().resolve()).done(function() {
  console.log("complete.");
}).fail(function() {
  console.log("error.");
});

Array.prototype.reduce() を使います.最初に $.Deferred().resolve() を作成し,これに対して.then()を.reduce()でチェインしていくわけです.

responseは $.ajax() で取得したデータです.初回は $.Deferred().resolve() の返り値であるundefinedが帰ってくるので,ifを使用します.

最後の .done() は処理が正常完了した時の処理です..fail() はエラー時の処理です.

上記を実行すると,非同期で順番に$.ajax()が呼ばれ,iTunes Search APIから指定されたidの曲情報を取得しconsoleに表示します.

匿名関数のみでスッキリと記述できたような気がします.