javascript - 谁能帮我用promise写一个例子?需求是依次请求三个URL,并把请求结果依次输出
迷茫
迷茫 2017-04-11 11:07:34
[JavaScript讨论组]

谁能帮我用promise写一个例子?

需求是依次请求三个URL,并把请求结果依次输出
http://baidu.com/a.html
http://baidu.com/b.html
http://baidu.com/c.html

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(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用,不用再套一层了.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号