@GNG999

Как в javascript classe запустить метод в другом методе?

Есть класс с методами
Как в методе getAllForClient запустить метод getItems ? При текущем написании с использованием this, выходит ошибка getItems of undefined ?
class DeviceController {
  async getItems(query)  {
        let { brandId, typeId, limit, page, } = req.query
        page = page || 1
        limit = limit || 9
        let offset = page * limit - limit
        let devices;
        if (!brandId && !typeId) {
            devices = await Product.findAndCountAll({ limit, offset })
        }
        return devices
    }
    
    async getAllForClient(req,res){
        let newList=[]
        let devices=await this.getItems(req.query)
        for (let index = 0; index < devices.length; index++) {
          let newItem={
              name:devices[index].name,
              price:devices[index].price,
              videoUrl:devices[idnex].videourl            
          }
          newList.push(newItem)        
        }
        return res.json(newList)
    }
}
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ответы на вопрос 2
@antares4045
Код класса правильный. Проблема с вызовом метода или созданием экземпляра:
let controller = new DeviceController() //new обязательно
controller.getAllForClient(req,res)
Ответ написан
Комментировать
@alexalexes
Проблема классическая в отношениях разработчика и JS - смена контекста объекта класса от места вызова.
Чтобы заставить JS использовать только контекст объекта, нужно использовать стрелочный синтаксис для методов:
class DeviceController {
  getItems = async (query)  => {
        let { brandId, typeId, limit, page, } = req.query
        page = page || 1
        limit = limit || 9
        let offset = page * limit - limit
        let devices;
        if (!brandId && !typeId) {
            devices = await Product.findAndCountAll({ limit, offset })
        }
        return devices
    };
    
   getAllForClient = async (req,res) => {
        let newList=[]
        let devices=await this.getItems(req.query)
        for (let index = 0; index < devices.length; index++) {
          let newItem={
              name:devices[index].name,
              price:devices[index].price,
              videoUrl:devices[idnex].videourl            
          }
          newList.push(newItem)        
        }
        return res.json(newList)
    }
}

PS: В дострелочные времена нужно было убедиться, что this это тот самый this в конструкторе класса и передавать в другую переменную класса, например в that, чтобы потом использовать во всех методах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы