3 个回答

用上jquery,写法大致如下:

var result = {};
    new Promise(function (reslove, reject) {
      $.ajax({
        url:'...a.html'
      }).done(function (data) {
        result.a = data;
        reslove(result);
      }).fail(function (data) {
        reject(data);
      })
    }).then(
      function (value) {
        return new Promise(function () {
          $.ajax({
            url:'...b.html'
          }).done(function (data) {
            result.b = data;
            reslove(result);
          }).fail(function (data) {
            reject(data);
          })
        })
      },
      function (data) {
        alert('a.html请求出错,出错代码:' + data);
      }
    ).then(
      function (value) {
          $.ajax({
            url:'...c.html'
          }).done(function (data) {
            result.c = data;
            console.log(result);
          }).fail(function (data) {
            alert('c.html请求出错,出错代码:' + data);
          })
      },
      function (data) {
        alert('b.html请求出错,出错代码:' + data);
      }
    )

这是一个简单的请求队列

var urls = [
  "https:/baidu.com/a.html",
  "https:/baidu.com/b.html",
  "https:/baidu.com/c.html"
]

var sequence = Promise.resolve()

urls.forEach(function(url) {
  sequence = sequence.then(function() {
    return getUrlfunc(url)
  }).then(function(result) {
    console.log(result.length)
  }).catch(function(err){
    console.log(err)
  })
})

function getUrlfunc(url) {
  return new Promise(function(resolve, reject){
    $.get(url, function(result){
      resolve(result)
    })
  })
}
var urls = [
  "https:/baidu.com/a.html",
  "https:/baidu.com/b.html",
  "https:/baidu.com/c.html"
];
var i = 0;
function next(){
    if(i>=urls.length) return;
    Promise.resolve(jQuery.get(urls[i])).then(function(data){
        console.log(data);
        next();
    });
    i++;
}

建议用一个Promise队列,这样写起来就会简单些,比如我实现的一个队列queue-fun;

var urls = [
  "https:/baidu.com/a.html",
  "https:/baidu.com/b.html",
  "https:/baidu.com/c.html"
];
var queue = new queueFun(1); //实例化一个并发为1的队列,达到依次执行的目的
function getHtml(url){
    return jQuey.get(url);
}
urls.forEach(function(url) {
    queue.push(getHtml,[url]).then(console.log)
});
queue.start();

jQuey.get() 返回的是一个延迟对象,可以当Promise用,不用再套一层了.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题