是否可以通过AJAX加载更多文件?



$.ajax({
  url: ["test1.html", "test2.html", "test3.html"],
  success: function(data1, data2, data3) {
    // Do something
  }
});


因为我想避免回调...

  $.ajax({
  url: "test1.html",
  success: function(data) {

    $.ajax({
      url: "test2.html",
      success: function(data) {

        $.ajax({
          url: "test3.html",
          success: function(data) {

            // Do something

          }
        });

      }
    });

  }
});

最佳答案

我更喜欢编写递归函数,并为此类使用堆栈。这只会在处理结束时运行successerror一次,并将依次获取每个url。但是,顺序获取它们可能会使加载时间更长,因为它不允许浏览器并行处理请求!与此不同的是,并行运行所有请求并按顺序处理结果。

function fetch (urls, success, error) {
  if (urls.length) {
    $.ajax({
      url: urls[0],
      success: function () {
        fetch(urls.slice(1), success, error)
      },
      error: error
    })
  } else {
    success()
  }
}

fetch(["url1.html", "url2.html", ...], function () {
  // success
}, function () {
  // failure
})


在我刚键入时,可能会有一些小错误,但是这个概念很合理。还有更多的事情可以做,例如传递值/结果,但这些都是作为练习;-)在应用相同警告的情况下,这是一个仅按顺序处理结果的版本-请求可以并行发送:

function fetch (urls, success, error) {
  var fetched = 0
  var results = []
  var wasError = false
  function _fetch (i) {
    if (i < urls.length) {
      $.ajax({
        url: urls[i],
        success: function (result) {
          // report success when all the results are in
          results[i] = result
          if (++fetched == urls.length) {
            success(results)
          }
        },
        error: function () {
          if (!wasError) {
            wasError = true
            error()
          }
        }
      })
      // re-prime right away
      _fetch(i + 1)
    }
  }
  _fetch(0)
}

var urls = ["url1.html", "url2.html", ...]
fetch(urls, function (results) {
  $.each(results, ...)
}, function () {
  // error :(
})


快乐的编码。

关于javascript - 通过AJAX加载更多文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4045340/

10-12 15:22