2016-11-19 4 views
0

Ich verwende die Async-Bibliothek, um meine asynchronen Anforderungen in einem Web-Worker zu verwalten, der das Warteschlangenobjekt verwendet. Aber wenn ich die Warteschlange laufen Objekte Befehl töten es geht nicht in den Ruhezustand gegenüber liegenden in der Dokumentation sagt:Async-Warteschlange wird beim Beenden nicht inaktiviert

Sieg: eine Funktion, die den Abfluss Rückruf entfernt und leert verbleibenden Aufgaben aus der Warteschlange es zwingt untätig sein. Rufen Sie mit queue.kill() auf.

Ich möchte die Warteschlange anhalten und den Web Worker beenden, wenn ein Fehler in einer Aufgabe auftritt. Aber ich habe herausgefunden, dass das Töten nicht beendet ist, wenn ich die Nachricht rufe, die meinem Arbeitermanager sagt, dass er diesen Arbeiter töten soll. Stattdessen sagt es mir unendlich, dass Leerlauf falsch ist.

Ich verwende den folgenden Code ein:

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

Ist das ein Bug in async oder es ist ein Fehler von mir?

Antwort

0

Überprüfen Sie die Version der Async-Bibliothek, die Sie verwenden. Der Rückruf error wurde in Version 2.0 hinzugefügt.

Wenn Sie Version 1.5 verwenden, müssen Sie Fehler beim Rückruf behandeln, den Sie beim Hinzufügen einer Aufgabe zur Warteschlange übergeben. Angepasst von der docs:

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