首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >queue.js:函数数组与闭包数组的区别?

queue.js:函数数组与闭包数组的区别?
EN

Stack Overflow用户
提问于 2013-03-23 00:05:24
回答 1查看 376关注 0票数 1

因此,在尝试将获取的数据呈现到可视化之前,我试图确保发生了一系列HTTP请求。典型的交易,对吧?

我正在使用queue.js,并在queue.js github页面(https://github.com/mbostock/queue)上看到了这一点:

或者,如果您想串行地运行大量异步任务(这里表示为一个闭包数组):

代码语言:javascript
复制
    var q = queue(1);
    tasks.forEach(function(t) { q.defer(t); });
    q.awaitAll(function(error, results) { console.log("all done!"); });

Queue.js可以在Node.js内部或浏览器中运行。

因此,我做的是一个函数数组,每个函数都包含一个Meteor.http.get调用(因为我使用的是Meteor.js),然后逐行跟踪。

看起来正在发生的事情是,当我的数组--其中包含8个函数,每个插槽中都有一个看起来正确的函数--填充(然后像代码中的代码那样传递,不能推迟)时,只有一个实际运行。

我想知道的是。那么,总的来说,为什么只有一个函数在运行,尽管有8个函数被传递来推迟呢?但具体来说,它--对闭包有模糊的理解,我真的有一系列的函数。有什么是我遗漏的吗,因为文档特别提到闭包,这就是为什么所有的函数都没有执行吗?

谢谢你看这个!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-23 00:32:38

下面可能是您引用的语句的字面部分,可以在测试套件中找到:

代码语言:javascript
复制
"queue of asynchronous closures, processed serially": {
    topic: function() {
        var tasks = [], 
            task = asynchronousTask(),
            n = 10,
            q = queue(1);

        while (--n >= 0) tasks.push(task);

        tasks.forEach(function(t) { q.defer(t); });

        q.awaitAll(this.callback)
    },
    "does not fail": function(error, results) {
        assert.isNull(error);
    },
    "executes all tasks in series": function(error, results) {
        assert.deepEqual(results, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
    }
},

https://github.com/mbostock/queue/blob/master/test/queue-test.js#L103

它运行task = asynchronousTask(),这是从队列中取出并调用的

代码语言:javascript
复制
function asynchronousTask() {
    var active = 0;

    return function(callback) {
        ++active;

        process.nextTick(function() {
            try {
                callback(null, active);
            } finally {
              --active;
            }
        });
    };
}

上面的内部return function() {...}是我认为被引用的闭包,它保留了它对外部active变量的引用,因为每个异步函数都被从队列中删除。

当然,在回调和处理程序方面,这是相当强大的,因为它为您提供了维护和操作本地共享变量的方法,例如,如果您想知道返回了多少函数,以及列表何时用完了。换句话说,一个队列。

上面的示例中没有使用下面的内容,而是使用它作为参考点,看看它与上面的synchronousTask函数有何不同。

代码语言:javascript
复制
function synchronousTask() {
    var active = 0;

    return function(callback) {
        try {
            callback(null, ++active);
        } finally {
            --active;
        }
    };
}

https://github.com/mbostock/queue/blob/master/test/queue-test.js#L265

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15581736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档