2013-05-07 1 views
9
async.map(list, function(object, callback) { 
    async.series([ 
     function(callback) { 
     console.log("1"); 

     var booltest = false; 
     // assuming some logic is performed that may or may not change booltest 
     if(booltest) { 
      // finish this current function, move on to next function in series 
     } else { 
      // stop here and just die, dont move on to the next function in the series 
     } 

     callback(null, 'one'); 
     }, 
     function(callback) { 
     console.log("2"); 
     callback(null, 'two'); 
     } 
    ], 
    function(err, done){ 
    }); 
    }); 

Есть ли способ, что если функция1, если booltest оценивает значение true, не переходите к следующей функции, которая выводит «2»?Есть ли способ остановить выполнение следующей функции серии с async в nodejs?

+1

'обратного обратного вызова ('стоп')' остановит выполнение вашей серии и вызвать асинхронную функцию обратного вызова 'ERR =«stop''. –

+0

Не могли бы вы показать пример этого? Кажется, я не знаю, где эта переменная (флаг) будет идти, если booltest должен сбрасывать себя где-то в начале обработки элемента в списке. – Rolando

ответ

21

поток остановится, если обратный вызов с истинным в качестве ошибки аргумента, поэтому в основном

if (booltest) 
    callback(null, 'one'); 
else 
    callback(true); 

Должно работать

+0

Когда вы говорите обратный вызов с ложным, но обратный вызов (true) ... как это ложь? – Rolando

+0

Ну ваш первый аргумент «null» на самом деле является вашим аргументом err. Просто установите значение true, чтобы остановить выполнение вашего процесса. Это моя ошибка. Извините – drinchev

+1

Я не думаю, что это правильный дизайн. Первый аргумент должен быть ошибкой. Async прекращает обработку, если вызываемый вызов вызван, но использование его как общего способа прекратить обработку по любой причине кажется мне странным. –

1

Чтобы сделать это логично, вы могли бы просто переименовать error что-то вроде errorOrStop:

var test = [1,2,3]; 

test.forEach(function(value) { 
    async.series([ 
     function(callback){ something1(i, callback) }, 
     function(callback){ something2(i, callback) } 
    ], 
    function(errorOrStop) { 
     if (errorOrStop) { 
      if (errorOrStop instanceof Error) throw errorOrStop; 
      else return; // stops async for this index of `test` 
     } 
     console.log("done!"); 
    }); 
}); 

function something1(i, callback) { 
    var stop = i<2; 
    callback(stop); 
} 

function something2(i, callback) { 
    var error = (i>2) ? new Error("poof") : null; 
    callback(error); 
} 
1

Я думаю, что функция, которую вы ищете, isync.detect не map.

https://github.com/caolan/async#detect от

обнаружения (обр, итератора, обратный вызов)

Возвращает первое значение в обр, который проходит тест на асинхронной истину. Итератор применяется параллельно, что означает, что первый итератор возвращается . Истина будет запускать обратный вызов обнаружения с этим результатом. Это означает, что результат может не быть первым элементом в оригинальной arr (в терминах заказа), который проходит тест.

пример кода

async.detect(['file1','file2','file3'], fs.exists, function(result){ 
    // result now equals the first file in the list that exists 
}); 

Вы можете использовать это с booltest, чтобы получить результат, который вы хотите.

0

Я передаю объект, чтобы различать ошибку и просто функциональность. Который выглядит следующим образом:

function logAppStatus(status, cb){ 
    if(status == 'on'){ 
    console.log('app is on'); 
    cb(null, status); 
    } 
    else{ 
    cb({'status' : 'functionality', 'message': 'app is turned off'}) // <-- object 
    } 
} 

Позже:

async.waterfall([ 
    getAppStatus, 
    logAppStatus, 
    checkStop 
], function (error) { 
    if (error) { 
     if(error.status == 'error'){ // <-- if it's an actual error 
     console.log(error.message); 
     } 
     else if(error.status == 'functionality'){ <-- if it's just functionality 
     return 
     } 

    } 
}); 
Смежные вопросы