Node.js for循环并行数组处理,只有一个回调

node.js for loop parallel array processing with only one callback

本文关键字:有一个 回调 处理 数组 js for 循环 并行 Node      更新时间:2023-09-26

我想用一个模式数组和一个对象来创建一个for循环,以检查该对象是否与一个模式匹配。模式数组应并行处理,如果其中一个模式与对象匹配,则应调用onMatch()回调函数并取消其他操作,否则应调用onNoMatch()函数。

目前看起来是这样的。我不知道在哪里放onNoMatch()-函数,有时有多个回调:

module.exports = function matchingPattern(patterns, object, onMatch, onNoMatch) {
    for (key in patterns) {
        if(patterns[key].param1 != object.param1) continue;
        else if(patterns[key].param2 != object.param2) continue;
        else if(patterns[key].param3 != object.param3) continue;
        else {
            onMatch(patterns[key].id);
        }
    }
}

//编辑工作解决方案

var arr = [1,2,3,4,5]
var async = require('async');
function matchPattern(pat, object, cb){
    console.log(pat +' % '+ object);
    if(pat % object == 0) cb(pat); 
    else cb();
}
function matchingPattern(patterns, object, onMatch, onNoMatch) {
    async.each(patterns, function(pat, callback){
        matchPattern(pat, object, function(match){
            return callback(match);
        });
    }, function (res){
        if(res) return onMatch(res);
        return onNoMatch()
    });
}
matchingPattern(arr, {2=2matches, 6=no matches}, function onMath(a){
    console.log('onMatch('+a+')');
}, function onNoMatch(){
    console.log('onNoMatch()');
});

我个人更喜欢使用async库,因为使用async可以很容易地处理这些工作流。

var FOUND = {
  code: 'Custom'
  item: null,
  pattern: null
};
  function matchingPattern(patterns, object, onMatch, onNoMatch) {  
    async.each(patterns, function(pattern, callback){
      // check pattern as per your business logic.
    // assuming matchPattern is async
       matchPattern(pattern, object, function(match){
           if(match){
             FOUND.item = object;
             FOUND.pattern = pattern;
             return callback(FOUND);
           }else{
             return callback();
           }
       }); 
    },
    function (error, result){
      if(error){
        if(error.code == 'Custom'){
          // its not an error. We have used it as an error only.
          return onMatch();
        }else{
          // handle error here.
        }
      }
      // all items done and we have not found any pattern matching.
      return onNoMatch();
    });// end of async.each();
}// end of matchingPattern()