Javascript异步范围问题

时间:2014-07-22 10:55:49

标签: javascript asynchronous

我正在尝试实现异步ajax调用的一些流控制。我的项目基本上接收了一个值数组,然后为每个值完成一个ajax调用,处理结果然后在完成时运行一个函数。

我有一个范围问题,因为流控制功能在第二次启动时使用不同的工作数组来完成其作业参考值被覆盖。我已经重写了我在消除所有其他功能方面遇到问题的部分,并将其发布在jsfiddle上。

http://jsfiddle.net/qanx9/

启动代码时,jobRunner函数将控制台将密钥记录到找到工作的globalObj。在函数job2的第3次运行中丢失,现在所有内容都指向job1。我已经尝试将此函数中的所有内容放在匿名函数中,但这没有任何区别。

这是我第一次尝试流控制,我的项目实际上是在nodejs中。有些图书馆为我这样做,但我正在努力弄清楚它是如何工作的。

// global used to track async flow control and store completed work
globalObj = {
    job1: {
        work: [0,1,2,3,4,5,6,7,8,10],
        results: []
    },
    job2: {
        work: [11,12,13,14,15,16,17,18,19,20],
        results: []
    },
    async: {
        limit: 5,
        running: 0
    }
};

// flow control
function jobRunner(job) {
    console.log(job)
    g = globalObj.async;
    j = globalObj[job]; 
    while (g.running < g.limit && j.work.length > 0) {
        var task = j.work.shift();
        fakeAsyncAjax(task,function(result){
            j.results.push(result);
            g.running--;
            if (j.work.length > 0) {
                jobRunner(job);
            } else if (g.running == 0) {
                jobDone(job);
            }
        })
        g.running++;
    }
}

function jobDone(job) {
    console.log(job+' complete..');
}

// instead of doing real ajax calls here ive done a basic simulation with a random delay, using setTimeout to make it async.
function fakeAsyncAjax(ref,completeFunc){
    setTimeout(function(){
        completeFunc(ref);
    },Math.floor((Math.random() * 500) + 1))
}

// initate jobs
jobRunner('job1')
jobRunner('job2')

0 个答案:

没有答案