nodejs js 队列运行问题

var array = [1,2,3,4];
function check()
{
if(array.length > 0)
var url = array.pop();
load(url);
}}
function load(url)
{
http.get(url, function(res){
check();
)
}}

做了个简单的队列 但现在 执行一个 再执行 一个 我想批量执行100个 再执行 100个 怎么控制呢 请问

阅读 2.9k
4 个回答
  • TALK IS CHEAP, SHOW ME THE CODE

  • Promise version

const array = []
for(let i = 0; i < 109; ++i) array.push(i)
const once = 100
const times = Math.ceil(array.length / once)
const load = async url => ({ url }) // replace here with your load http.get
const init = async () => {
    const results = []
    for(let n = 0; n < times; ++n) {
        const result = await Promise.all(array.slice(n * once, (n + 1) * once).map(url => load(url)))
        results.push(result)
    }
    return results
}
init().then(console.log).catch(console.error)
  • async version

var async = require('async')
var array = [];
// prepare data
for(var i = 0; i < 109; ++i) { // 模拟总共109个请求,可以任意更改
    array.push(i)
}
var once = 100;
var times = Math.ceil(array.length / once);

function parallelRequest(urls, cb) {// urls is an array, contains url
    async.parallel(urls.map(url => load(url)), function(err, results) {
        if(err) return cb(err)
        cb(null, results)
    })
}
function load(url) { 
    return function(callback) {
        get(url, function(res) { // replace it using http.get
            //.... focus on error and handle it
            callback(null, url)
        })
    }
 }
var get = function(url, callback) {
    callback(null, {
        url: 'url' + url
    });
};


// request 100 urls in parallel for each request
async.times(times, function(n, next) {
    parallelRequest(array.slice(n * once, (n + 1) * once), function(err, res) {
        next(err, res);
    });
}, function(err, res) {
    // we should now have times=2 array
    console.log(res)
});

我感觉先取出100个,然后用Promise.all 等待其全部执行完之后再取100个,应该可行.

可以考虑用async模块

算法伪代码:

var waiting = 0
function check() {
  while (waiting < 100 && hasNext()) {
    ++waiting
    doNext().onDone(function() {
      --waiting
      check()
    })
  }
}

check()

完整示例代码:

var queue = new Array(10000)
for (var i = 0; i < 10000; ++i)
  queue[i] = i

function hasNext() {
  return queue.length > 0
}

function doNext() {
  var onDone

  var i = queue.shift()

  function setDone(callback) {
    onDone = callback
  }
  setTimeout(function() {
    console.log(i)
    onDone()
  }, 1000)
  return { onDone: setDone }
}

var waiting = 0
function check() {
  while (waiting < 100 && hasNext()) {
    ++waiting
    doNext().onDone(function() {
      --waiting
      check()
    })
  }
}

check()

运行结果:每秒钟打印 100 个数字,按顺序,从 0 开始。

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