2016-02-08 5 views
2

я был под впечатлением, что поведение async.auto было то, что если одна из задач возвратила err, глобальный обратный вызов будет вызван с этой ошибкой и всех последующих задачами будет не выполняется. В конце концов, зачем они? Глобальный обратный вызов был вызван, так что об ошибке уже сообщалось.async.auto: остановить всю цепочку после первой ошибки

Оказалось, что только задачи , которые зависят от неисправной задачи, не будут работать, а остальное будет.

'use strict'; 

var async = require('async'); 

async.auto({ 
    downloadAudio: function (callback) { 
     console.log("downloading audio..."); 
     setTimeout(function() { 
      console.log("downloaded audio."); 
      callback(); 
     }, 10000); 
    }, 
    downloadScript: function (callback) { 
     console.log("downloading script..."); 
     setTimeout(function() { 
      return callback(new Error("ERROR downloading script!")); 
     }, 1000); 
    }, 
    preprocessAudio: ['downloadAudio', function (callback) { 
     console.log("preprocessing audio..."); 
     setTimeout(function() { 
      console.log("done preprocessing audio."); 
      callback(); 
     }, 5000); 
    }] 
}, function (err) { 
    if (err) { 
     return console.error(err.message); 
    } 

    console.log('done.'); 
}); 

В этом фрагменте кода, как downloadAudio и downloadScript сразу работать параллельно, и preprocessAudio зависит от downloadAudio. Проблема заключается в том, что, когда downloadScript возвращает err, preprocessAudio все равно будет работать, несмотря на то, что нет никакого смысла, потому что дело не удалось в целом уже:

downloading audio... 
downloading script... 
ERROR downloading script! 
downloaded audio. 
preprocessing audio... 
done preprocessing audio. 

Я знаю, я мог бы сделать preprocessAudio зависеть от downloadScript также, но это означает, что что preprocessAudio будет ждать завершения downloadScript, хотя они могут работать параллельно без проблем.

Есть ли элегантный способ решить эту проблему?

Спасибо, Jan

+0

Этот вопрос был отмечен как ошибка в это время: https://github.com/caolan/async/issues/1023 –

ответ

0

Учитывая то, что вы не хотите preprocessaudio работать, если downloadScript возвратил ошибку, preprocessaudio действительно «полагаться» на двух других функций.

Просто добавьте зависимость, и все должно работать правильно.

'use strict'; 

var async = require('async'); 

async.auto({ 
    downloadAudio: function (callback) { 
     console.log("downloading audio..."); 
     setTimeout(function() { 
      console.log("downloaded audio."); 
      callback(); 
     }, 10000); 
    }, 
    downloadScript: function (callback) { 
     console.log("downloading script..."); 
     setTimeout(function() { 
      return callback(new Error("ERROR downloading script!")); 
     }, 1000); 
    }, 
    preprocessAudio: ['downloadAudio', 'downloadScript', function (callback) { 
     console.log("preprocessing audio..."); 
     setTimeout(function() { 
      console.log("done preprocessing audio."); 
      callback(); 
     }, 5000); 
    }] 
}, function (err) { 
    if (err) { 
     return console.error(err.message); 
    } 

    console.log('done.'); 
}); 
+0

не работает, потому что 'функция (эээ, обратный вызов)' не надлежащая подпись; это либо «функция (обратный вызов)», либо «функция (обратный вызов, результаты)». Вы заметите, что 'preprocessAudio' не будет работать, даже если' downloadScript' * делает * успешно. Я не смотрел на обещание; Я понял, что асинхронная библиотека способна сделать тяжелый подъем для меня. –

+0

Да, я только что подтвердил, что обратный вызов недействителен. Тем не менее, я немного запутался в том, чего именно вы пытаетесь достичь. Вы не хотите, чтобы preprocessAudio запускался, если downloadScript терпит неудачу, но вы не хотите, чтобы preprocessAudio дождался downloadScript, и вы не хотите, чтобы preprocessAudio зависели от downloadScript, когда, очевидно, если вы хотите, чтобы все вышло, если сработает сценарий downloadScript? Не имеет большого смысла пытаться сделать processAudio не запущенным, если downloadScript терпит неудачу, но потом не дожидаться, если он будет успешным:/ – Seonixx

+0

Я думаю, что компиляция асинхронных параллелей и асинхронных серий/авто может лучше справиться с этим, но Я не вижу, как можно запустить preprocessAudio только в том случае, если downloadScript успешно, но не дожидаться его завершения. – Seonixx