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

Using underscore _.delay, how do I stop future execution and provide user status

本文关键字:执行 状态 用户 未来 何停止 下划线 delay      更新时间:2023-09-26

我需要缓慢地处理一个输入数组,在不达到服务器速率限制的情况下对每个元素进行asych调用。我可以用下划线_.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函数。

提前谢谢。

Undercores的_.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获得承诺的方法。