代码之家  ›  专栏  ›  技术社区  ›  Developer

从请求生成队列的JavaScript

  •  0
  • Developer  · 技术社区  · 6 年前

    我有一个函数,它从服务器请求数据并打开一个页面。并返回页索引。调用了-showpage()。我还有方法-active()(返回当前打开的页索引)、next()和previous()

    但问题是当我执行这种类型的脚本时:

    console.log(active());
    showpage(9998)
    console.log(active());
    console.log(next());
    console.log(active());
    

    它应该输出我:

    9998年 9999个

    但它给了我一些绝对错误的东西。我知道这与之前完成的服务器请求有关,这些请求正在扰乱结果。

    所以我创造了一个简单的小提琴,它显示了我的问题:

    https://jsfiddle.net/xpvt214o/875828/

    这是一个小样本:

    button.on("click", function(){
        makeRequest("https://jsonplaceholder.typicode.com/photos", 1);
        makeRequest("https://jsonplaceholder.typicode.com/comments", 2);
        makeRequest("https://jsonplaceholder.typicode.com/todos", 3);
        makeRequest("https://jsonplaceholder.typicode.com/albums", 4);
        makeRequest("https://jsonplaceholder.typicode.com/users", 5);
    })
    
    function makeRequest(url, id){
        $.ajax({
            url: url,
        })
    .done(function( data ) {
        console.log(id);
     });
    }
    

    所以输出应该是:

    1个, 4个,

    项目中没有jQuery,这里只是添加了一个简单的示例

    有没有办法让他们轻易地排队?有人认为类似于C#中的信号灯lim?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Raj Nandan Sharma    6 年前

    这里有一个使用递归来维护序列的更新代码。我们填写一系列请求,然后逐个处理,直到没有其他请求为止

    var reqArr= [];
    
    button.on("click", function(){
      reqArr.push({url:"https://jsonplaceholder.typicode.com/photos",v:1});
      reqArr.push({url:"https://jsonplaceholder.typicode.com/comments",v:2});
      reqArr.push({url:"https://jsonplaceholder.typicode.com/todos",v:3});
      reqArr.push({url:"https://jsonplaceholder.typicode.com/albums",v:4});
      reqArr.push({url:"https://jsonplaceholder.typicode.com/users",v:5});
      makeRequest();
    })
    
    function makeRequest(){
      if(reqArr.length==0) return;//stop recursion
      var obj=reqArr.shift();
    
      $.ajax({
        url: obj.url,
      })
      .done(function( data ) {
        console.log(obj.v);
        return makeRequest();
      });
    }