Progettazione per il recupero delle risorse preferite

1

Ho tre risorse Hotel , Address e Image . Un hotel può avere immagini maggio ma solo un indirizzo. Mentre mostro i dettagli dell'hotel ho bisogno di recuperare il suo indirizzo e tutte le immagini di esso così, nel mio controller il seguente codice va:

function getHotel(req, res) {
  const { hotelId, merchantId } = req.params;
  Hotel.search(req, [['id', '=', hotelId], ['merchant_id', '=', merchantId]])
      .then(function then_(hotel) {
        Hotel.searchAddress(req, hotelId).then(function then_(address) {
          hotel.address = address;
          Hotel.searchImages(req, hotelId).then(function (images) {
            hotel.images = images;
            res.status(200).json({ hotel });
          });
        });
      }).catch(function catch_(err) {
        console.log(err);
        res.status(500).send();
      });
}

Si può vedere che le query SQL sono all'interno dei metodi delle classi statiche ma la preoccupazione più dolorosa è che il codice mi sembra procedurale. So che esiste un pattern Repository ma non l'ho ancora usato molto. Come posso rendere il codice dato più OOP e flessibile?

    
posta CodeYogi 11.07.2017 - 10:21
fonte

1 risposta

2

Considererei lo spostamento delle chiamate Hotel.searchAddress e Hotel.searchImages allo stesso livello. Quindi tutte le promesse possono essere passate a Promise.all () , che assembla la risposta.

Questo è possibile perché nessuno dei tuoi passaggi dipende dai dati delle promesse esterne. Dove esiste una dipendenza dai dati, è possibile annidare solo le chiamate dipendenti come nell'esempio, che ridurranno al minimo la profondità dei callback.

per es.

function getHotel(req, res) {
  const { hotelId, merchantId } = req.params;
  Promise.all([
      Hotel.search(req, [['id', '=', hotelId], ['merchant_id', '=', merchantId]]), 
      Hotel.searchAddress(req, hotelId),
      Hotel.searchImages(req, hotelId)
    ]).then(function (values) {
        const { hotel, address, images } = values; 
        hotel.address = address;
        hotel.images = images;
        res.status(200).json({ hotel });
    }).catch(function (err) {
        console.log(err);
        res.status(500).send();
    });
}
    
risposta data 11.07.2017 - 14:58
fonte