异步队列在kill时不会空闲

时间:2016-11-19 16:56:27

标签: javascript asynchronous queue async.js

我使用异步库来管理使用队列对象的Web worker中的异步请求。 但是当我运行队列对象kill命令时,它不会进入空闲状态,选择文档说:

  

kill:一个删除了漏极回调并清空余量的函数   队列中的任务强制它进入空闲状态。使用queue.kill()调用。

我希望在一个任务中出现错误时停止队列并终止Web worker。但我发现,当我打电话告诉我的工人经理杀死这名工人时,杀人没有完成。相反,它无限告诉我空闲是假的。

我使用以下代码:

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;
        }
    }
};

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

1 个答案:

答案 0 :(得分:0)

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

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

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