【问题标题】:async queue doesn't go idle on kill异步队列在杀死时不会空闲
【发布时间】:2016-11-19 16:56:27
【问题描述】:

我使用异步库来使用队列对象在 Web Worker 中管理我的异步请求。 但是当我运行 queue objects kill 命令时,它不会进入空闲状态,这与文档相反:

kill: 一个删除排水回调并清空剩余的函数 队列中的任务迫使它进入空闲状态。使用 queue.kill() 调用。

我想在一项任务出现错误时停止队列并杀死网络工作者。但是我发现,当我调用告诉我的工人经理杀死该工人的消息时,杀死还没有完成。相反,它无限地告诉我空闲是假的。

我使用以下代码:

var q = async.queue(function(task, callback) {
    FileReader.readBlock(task.file, task.offset, task.blockSize)
    .then(function(block) {
        return sendBlock(task.uuid, block, task.blockNumber);
    })
    .then(function(result) {
        callback(null, result);
    }).catch(function(error) {
        callback(error);
    });
}, 8);

q.drain = function() {
    console.log('All Tasks finished successfully.');
};

q.error = function(error, task) {
    this.kill();

    while(true) {
        if(this.idle()) {
            self.postMessage({
                type: 'error',
                msg: 'A task failed. Upload is killed.'
            });
            break;
        }
    }
};

这是异步中的错误还是我的错误?

【问题讨论】:

    标签: javascript asynchronous queue async.js


    【解决方案1】:

    仔细检查您正在使用的异步库的版本。 error 回调是在 2.0 版本中添加的。

    如果您使用的是 1.5 版,则在将任务添加到队列时需要处理您传递的回调中的错误。改编自docs

    q.push({name: 'foo'}, function (err) {
        if (err) {
          // handle error here
          q.kill(); 
          // ... etc
        }
        console.log('finished processing foo');
    });
    

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2018-01-14
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多