2016-11-10 3 views
0

Сценарий: У меня есть куча данных базы данных, которые необходимо изменить последовательно, и если что-то не получается, мне нужно прекратить дальнейшую обработку.Проблема с async.waterfall в nodejs

Стратегия: Использование async.waterfall. Таким образом, я могу передавать переменные по мере необходимости на следующую итерацию и сбои сигналов.

Вопрос: Когда у меня есть три или более элемента данных для изменения, я застреваю после второго элемента, пытаясь сделать обратный вызов.

Код:

var processData = function(<params>) { 
    var funcArray = []; 
    funcArray.push(processItemInitial); 
    for(var i = 0; i < length - 1; i++) { 
    funcArray.push(processItem); 
    } 

    async.waterfall(funcArray, function (err, status) { 
    console.log("status: " + status); 
    console.log("err: " + err); 
    }); 
} 

//uses global variable 
var processItemInitial = function (callback) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
     //do stuffs 
    } else { 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }); 
} 

// uses variables passed through call backs 
var processItem = function (<params>) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
    //do stuffs 
    } else { 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }); 
} 

ответ

1

Я читаю этот вопрос, как вы хотите, чтобы остановить выполнение, если что-то пойдет не так. Async обеспечивает действительно хороший способ сделать это. Из документации:

Однако, если любой из задач, передать сообщение об ошибке своей собственной функции обратного вызова, следующая функция не выполняется, а основной обратный вызов немедленно вызывается с ошибкой http://caolan.github.io/async/docs.html#waterfall

Вы должен иметь возможность вызвать callback с ошибкой в ​​качестве первого аргумента, если что-то пойдет не так. У вас есть случаи, установленные для if (data != null) поэтому используйте else случай, что для отправки callback('No data found for <some var>')

var processItem = function (<params>) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
    //do stuffs 
    } else { 
     callback('Data not found for <some var>'); 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }); 
} 

Если отсутствие данных не ошибка, вы беспокоитесь о том, и вы обеспокоены Firebase вопросов, вы можете .catch() ошибки, так как вы используете «Thenable» ссылки: https://firebase.google.com/docs/reference/js/firebase.Thenable#catch

var processItem = function (<params>) { 
    productsRef.child(<some var>).child('quantity').transaction(function(data){ 
    if(data != null) { 
    //do stuffs 
    } else { 
     console.log("null data"); 
    } 
    return data; 
    }).then(function() { 
    callback(<params>); 
    }).catch(function(error) { 
    // Will exit the waterfall 
    callback(error); 
    }); 
} 
+0

Это помогло мне отладить проблему в моем коде. Я получал исключение, которое я не видел, так как я его не ловил. – Ahsan

 Смежные вопросы

  • Нет связанных вопросов^_^