Как искать в массиве в Node.js неблокирующим способом?

У меня есть массив, который:

[ 4ff023908ed2842c1265d9e4, 4ff0d75c8ed2842c1266099b ]

И я должен найти, если следующее внутри внутри этого массива

4ff0d75c8ed2842c1266099b

Вот что я написал:

Array.prototype.contains = function(k) {
  for(p in this)
     if(this[p] === k)
        return true;
  return false;
}

По-видимому, он работает неправильно или лучше иногда работает, но мне кажется, что он блокирует. Есть ли кто-нибудь, кто может проверить это?

большое спасибо

Ответы

Ответ 1

Неблокирующая функция поиска

Array.prototype.contains = function(k, callback) {
    var self = this;
    return (function check(i) {
        if (i >= self.length) {
            return callback(false);
        }

        if (self[i] === k) {
            return callback(true);
        }

        return process.nextTick(check.bind(null, i+1));
    }(0));
}

Использование:

[1, 2, 3, 4, 5].contains(3, function(found) {
    if (found) {
        console.log("Found");
    } else {
        console.log("Not found");
    }
});

Однако для поиска значения в массиве лучше использовать функцию поиска встроенного массива Javascript, так как она будет намного быстрее (так что вам, вероятно, не понадобится, чтобы она не блокировалась):

if ([1, 2, 3, 4, 5].indexOf(3) >= 0) {
    console.log("Found");
} else {
    console.log("Not found");
}

Также рассмотрим библиотеку underscore, которая делает все кросс-платформенное: http://underscorejs.org/