使用下划线_.delay,如何停止将来执行并提供用户状态

时间:2015-02-28 17:30:09

标签: javascript arrays underscore.js

我需要缓慢处理一个输入数组,对每个元素进行asych调用,而不会在服务器上达到速率限制。我可以使用underscore _.delay()完成我想要的大部分操作,但是如果用户决定保释,我如何(a)取消延迟执行,以及(b)显示包含当前索引的状态数组。

这是我到目前为止所拥有的......

function processArray(array) {
    var processElement = function(element) {
        return doAsynch(element);  // asynch task returning a promise
    };

    _.each(array, function(element, index) {
        _.delay(processElement, index * 1000, element);
    });
}

function userDecidesToCancel() {
    // stuck here
}

如果用户决定取消,比如在我们到达元素N之前,我很高兴让doAsynch(N-1)完成,但我不想再开始工作了(对于N> = 1)。有办法吗?

另外,关于状态,我无法弄清楚如何优雅地呈现我们完成的项目N,即我想说...

    _.each(array, function(element, index) {
        _.delay(processElement, index * 1000, element).then(function(result) {
            // how can I get the result here? I'd like to log status
            console.log("just did " + index + " " + result);
        });
    });

我可以将该日志消息的一部分放在processElement函数(记录结果的部分)中,但我还需要相对于数组长度的索引,以便显示百分比进度。我认为该索引的知识正确属于_.each循环,未传递给processElement函数。

提前致谢。

1 个答案:

答案 0 :(得分:1)

下划线' _.delay函数只包含原始setTimeout。 因此,您可以收集所有超时,然后使用clearTimeout取消它们:

var cancels = _.map(array, function(element, index) {
  return _.delay(processElement, index * 1000, element);
});

function cancel() {
  // you can also track the current element from processElement and cancel 
  // only the timeouts that follow that one, but it might be an overkill.
  _.each(cancels, function(cancel) {
    clearTimeout(cancel);
  });
}

不幸的是,对于当前的实现,我没有看到从processElement获得承诺的方法。