1) для начала не стоит вызывать
require
внутри функций.
2) далее, не стоит засорять глобальное пространство (и автору модуля 'sem' скажите о том же, если его модуль умеет только экспортироваться в глобальное пространство, а не возвращать таблицу методов).
3) (вариация п.2) используйте локальные переменные как можно чаще, особенно внутри функций. Используйте глобальные только там, где это реально необходимо. Иначе будете напарываться на внезапные коллизии.
4) у меня, вообще, куча претензий к вашему коду в обоих вставках. От их количества мне уже просто хочется взять и переписать, ничего не объясняя, а потом отвечать на все вопросы о том почему так :)
5)
Правильно ли я делаю
С учётом всего вышеперечисленного, оно должно выглядеть совсем по-другому.