2015-09-25 8 views
22

Potrzebuję napisać kilka modułów, które ładują dane jeden raz, a następnie zapewniają interfejs dla tych danych. Chciałbym ładować dane asynchronicznie. Moja aplikacja już korzysta z obietnic. Czy daje obietnicę w wyniku wymagania modułu poprawnego wzorca/idiomu?Czy dostarczenie obietnicy jako eksportu modułu jest prawidłowym wzorcem inicjowania asynch w Node.js?

Przykład Moduł:

var DB = require('promise-based-db-module'); 

module.exports = 
    DB.fetch('foo') 
    .then(function(foo){ 
    return { 
     getId: function(){return foo.id;}, 
     getName: function(){return foo.name;} 
    }; 
    }); 

Przykład użycia:

require('./myPromiseModule') 
.then(function(dataInterface){ 
    // Use the data 
}); 

UPDATE:

Użyłem tego przez jakiś czas teraz i działa świetnie. Jedna rzecz, której się nauczyłem, a jest to zasugerowane w przyjętej odpowiedzi, jest to, że dobrze jest zachować pamięć podręczną samej obietnicy, a gdy chcesz uzyskać dostęp do danych, użyj next. Przy pierwszym dostępie do danych kod zaczeka, aż obietnica zostanie rozwiązana. Późniejsze użycie next spowoduje natychmiastowe przesłanie danych. na przykład

var cachedPromise = require('./myPromiseModule'); 
cachedPromise.then(function(dataInterface){ 
    // Use the data 
}); 
... 
cachedPromise.then(function(dataInterface){ 
    // Use the data again somewhere else. 
}); 
+1

Wygląda na to, że to działa dobrze dla mnie. – jfriend00

+1

Tak, wydaje się idealnie w porządku. Jeśli korzystasz z modułów ES6, możesz nawet użyć synchronicznego modułu ładującego moduły i "importować" synchronicznie ". – Bergi

+0

Czy odpowiedź poniżej rozwiązała Twój problem? Jeśli tak, proszę zaznaczyć najlepszą odpowiedź jako zaakceptowaną odpowiedź, zaznaczając zielony znacznik wyboru po lewej stronie tej odpowiedzi, aby wskazać społeczności, że pytanie zostało odebrane, a następnie zarówno ty, jak i osoba, która dostarczyła odpowiedź, zdobędziesz punkty reputacji które może prowadzić do zwiększenia uprawnień w StackOverflow. – jfriend00

Odpowiedz

10

Wydaje się, że jest to doskonały interfejs dla modułu, który ma za zadanie jednorazowe pobranie niektórych danych.

Dane uzyskuje asynchroniczny więc obietnica sens tego. Celem jest jednorazowe pobranie danych, a następnie zezwolenie na wykorzystanie wszystkich miejsc, w których moduł ten jest wykorzystywany, po prostu uzyskać dostęp do tych oryginalnych danych. Obietnica działa również świetnie, ponieważ jest to urządzenie jednorazowe, które zapamiętuje jego stan.

Osobiście, nie jestem pewien, dlaczego trzeba metod getId() i getName() kiedy można po prostu oferują bezpośredni dostęp do właściwości, ale też może pracować.

Wadą tego złącza jest to, że nie ma możliwości wnioskowania o nowej kopii danych (nowo załadowany z bazy danych).

+0

Dzięki! To w zasadzie to, o czym myślałem, ale chciałem się upewnić, że nie jestem poza bazą. BONUS: Zastanawiam się, czy to już jest zrobione na wolności? Przygotuję pierwszy (i może więcej) komentarz, który łączy się z biblioteką w npm, która to robi (została opublikowana przed napisaniem pytania). – Tony

+0

Dodałem akcesory b/c Nie chcę zapewniać dostępu do zapisu dla załadowanych danych. Prawdopodobnie byłoby bardziej idiomatycznie po prostu nazwać je id i nazwa. Mogłem lub nie mogłem zaprogramować w nienazwanym języku, w którym konwencja nazewnictwa była standardowa. :) – Tony

Powiązane problemy