Передача метода объекта в качестве параметра в JavaScript

Я пишу модульные тесты JavaScript для коллекций Mongo. У меня есть массив коллекций, и я хотел бы создать массив элементов для этих коллекций. В частности, меня интересует использование Array.prototype.map. Я ожидаю, что что-то вроде этого сработает:

const collections = [fooCollection, barCollection, bazCollection];
const counts = collections.map(Mongo.Collection.find).map(Mongo.Collection.Cursor.count);

Но вместо этого я получаю сообщение об ошибке, говорящее мне, что Mongo.Collection.find не определено. Я думаю, что это может иметь какое-то отношение к тому, что Mongo.Collection является конструктором, а не созданным объектом, но я хотел бы немного лучше понять, что происходит. Может ли кто-нибудь объяснить, почему мой подход не работает и что мне нужно изменить, чтобы я мог передать метод find методу map? Спасибо!


person Reggie    schedule 27.12.2016    source источник
comment
Итак, fooCollection и тому подобные экземпляры Mongo.Collection? А что ты пытаешься find в первом звонке?   -  person T.J. Crowder    schedule 27.12.2016
comment
Возможно, вы действительно хотите использовать Mongo.Collection.prototype.find?   -  person apsillers    schedule 27.12.2016
comment
Ага. Я тоже так думал и пробовал, но все равно выдавал ошибку undefined. Я попробовал еще раз и понял, что Mongo.Collection.prototype.find действительно работает. Проблема в том, что map вызывает find(arrayItem) для каждого элемента, а не arrayItem.find(). Я могу передать карту анонимной процедуре, чтобы делать то, что я хочу. Это, вероятно, лучше в любом случае, потому что тогда я могу вернуть счет из одной функции, а не вызывать map дважды. Спасибо за помощь.   -  person Reggie    schedule 27.12.2016


Ответы (1)


find и count — это функции-прототипы, которые необходимо вызывать как методы (с надлежащим контекстом this) в экземпляре коллекции. map этого не делает.

Лучшим решением будет использование стрелочных функций:

const counts = collections.map(collection => collection.find()).map(cursor => cursor.count())

но есть также уродливый трюк, который позволяет обойтись без:

const counts = collections
.map(Function.prototype.call, Mongo.Collection.prototype.find)
.map(Function.prototype.call, Mongo.Collection.Cursor.prototype.count);
person Bergi    schedule 27.12.2016