使用Ajax进行JavaScript / jQuery回调

时间:2016-08-08 16:20:43

标签: javascript jquery ajax

我在Ajax请求之前运行的函数遇到问题(第一个是本地JSON,第二个是在线资源)。

在这个例子中,我希望countTheMovies在我的应用程序获得所需的所有信息并填充div之后在最后运行。相反,它正在直接运行。

我试图使用if条件延迟它,但没有快乐。我也试过回调,但我认为我必须得到那些错误(我假设回调就是答案)。我知道时间延迟,但因为在实际项目中我要采购250多部电影(因为时间延迟似乎是作弊)我想我会问这里。

任何人都可以推荐JavaScript或jQuery代码来解决这个问题吗?

$(function(){
  getMovieList();
});

function getMovieList() {
  $.ajax({
    url: "movielist.json",
    type: "GET",
    dataType: "JSON",
    success: function(data) {
      for (var i = 0; i < data.length; i++) {
        var title = data[i].title.toLowerCase().split(" ").join("+");
        var year = data[i].year;
        i === data.length - 1
          ? getMovieInfo(title, year, true)
          : getMovieInfo(title, year, false);
      }
    }
  });
}

function getMovieInfo(title, year, isLast) {
  $.ajax({
    url: "https://www.omdbapi.com/?t=" + title + "&y=" + year + "&plot=short&r=json",
    type: "GET",
    crossDomain: true,
    dataType: "JSON",
    success: function(val) {
      if (!val.Error) {
        movie = title.replace(/[^a-z0-9\s]/gi, '');
        $("#app").append(
          // appending info to divs
        );
      }
    }
  });
  if (isLast) countTheMovies();
};

function countTheMovies() {
  $("#app").append("There are " + $(".movie").length + " movies.");
}

我的失败的一部分:https://plnkr.co/edit/0mhAUtEsaOUWhkZMJqma?p=preview

5 个答案:

答案 0 :(得分:2)

你差不多了!

getMovieInfo成功回调中的getMovieList相同,您应该在countTheMovies的成功回调中调用getMovieInfo

答案 1 :(得分:2)

正如雅各布上面所说,在AJAX请求中移动countTheMovies调用。

&#13;
&#13;
$(function(){
  getMovieList();
});

function getMovieList() {
  $.ajax({
    url: "movielist.json",
    type: "GET",
    dataType: "JSON",
    success: function(data) {
      for (var i = 0; i < data.length; i++) {
        var title = data[i].title.toLowerCase().split(" ").join("+");
        var year = data[i].year;
        i === data.length - 1 
          ? getMovieInfo(title, year, true) 
          : getMovieInfo(title, year, false);
      }
    }
  });
}

function getMovieInfo(title, year, isLast) {
  $.ajax({
    url: "https://www.omdbapi.com/?t=" + title + "&y=" + year + "&plot=short&r=json",
    type: "GET",
    crossDomain: true,
    dataType: "JSON",
    success: function(val) {
      if (!val.Error) {
        movie = title.replace(/[^a-z0-9\s]/gi, '');
        $("#app").append(
          // appending info to divs
        );
        if (isLast) countTheMovies();
      }
    }
  });
};

function countTheMovies() {
  $("#app").append("There are " + $(".movie").length + " movies.");
}
&#13;
&#13;
&#13;

答案 2 :(得分:1)

如果您希望它成功运行,只需将countTheMovies()逻辑放在success中{AJ}请求的getMovieInfo回调中。

答案 3 :(得分:1)

您可以从Ajax调用的success字段内调用countTheMovies()函数。通过这种方式,它可以在您打算进行函数调用时使用。

答案 4 :(得分:0)

  

试试这个

$(function(){
      getMovieList();
    });

    function getMovieList() {
    $.when( $.ajax({
        url: "movielist.json",
        type: "GET",
        dataType: "JSON",
        success: function(data) {
          for (var i = 0; i < data.length; i++) {
            var title = data[i].title.toLowerCase().split(" ").join("+");
            var year = data[i].year;
            i === data.length - 1 
              ? getMovieInfo(title, year, true) 
              : getMovieInfo(title, year, false);
          }
        }
      }) ).then(function( data, textStatus, jqXHR ) {
      countTheMovies();
    });
    }

      function getMovieInfo(title, year, isLast) {
      $.ajax({
        url: "https://www.omdbapi.com/?t=" + title + "&y=" + year + "&plot=short&r=json",
        type: "GET",
        crossDomain: true,
        dataType: "JSON",
        success: function(val) {
          if (!val.Error) {
            movie = title.replace(/[^a-z0-9\s]/gi, '');
            $("#app").append(
              // appending info to divs
            );
          }
        }
      });
    };
    function countTheMovies() {
      $("#app").append("There are " + $(".movie").length + " movies.");
    }