2015-09-25 13 views
22

Ho bisogno di scrivere alcuni moduli che caricano i dati una volta e quindi forniscono un'interfaccia per quei dati. Mi piacerebbe caricare i dati in modo asincrono. La mia applicazione usa già delle promesse. Fornire una promessa come il risultato di richiedere a un modulo un modello/idioma valido?Fornisce una Promessa come esportazione di un modulo un modello valido per l'inizializzazione asynch in Node.js?

Esempio Modulo:

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;} 
    }; 
    }); 

Esempio di utilizzo:

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

UPDATE:

Ho usato questo per un po 'di tempo e funziona benissimo. Una cosa che ho imparato, ed è accennata nella risposta accettata, è che è bene mettere in cache la promessa stessa, e ogni volta che si desidera accedere ai dati utilizzare next. La prima volta che si accede ai dati, il codice attenderà fino alla risoluzione della promessa. L'utilizzo successivo di next restituirà immediatamente i dati. per esempio.

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

Sembra che funzionerebbe bene per me. – jfriend00

+1

Sì, sembra perfettamente a posto. Se si stanno utilizzando i moduli ES6, si potrebbe persino essere in grado di utilizzare un caricatore di moduli promettente e "importare" in modo sincrono ". – Bergi

+0

La risposta seguente ha risolto il problema? In tal caso, contrassegnare la risposta migliore come risposta accettata selezionando il segno di spunta verde a sinistra di tale risposta per indicare alla comunità che la tua domanda ha avuto risposta e quindi sia tu che la persona che ha fornito la risposta guadagnerai alcuni punti reputazione questo può portare a maggiori privilegi qui su StackOverflow. – jfriend00

risposta

10

Questa sembra un'interfaccia perfettamente valida per un modulo che ha il compito di eseguire un recupero una tantum di alcuni dati.

I dati sono ottenuti in modo asincrono, quindi una promessa ha senso. L'obiettivo è recuperare i dati solo una volta e quindi lasciare che tutte le posizioni utilizzate da questo modulo abbiano accesso ai dati originali. Una promessa funziona alla grande anche per questo perché è un dispositivo one-shot che ricorda il suo stato.

Personalmente, non sono sicuro del motivo per cui sono necessari i metodi getId() e getName() quando si può semplicemente offrire l'accesso diretto alle proprietà, ma entrambi possono funzionare.

Uno svantaggio di questa interfaccia è che non è possibile richiedere una nuova copia dei dati (caricati di recente dal DB).

+0

Grazie! Questo è fondamentalmente quello che stavo pensando, ma volevo essere sicuro di non essere fuori base. BONUS: Mi chiedo se questo è già fatto in natura? Sopprimerò il primo (e forse più) commento che collega a una libreria in npm che fa questo (che è stato pubblicato prima che scrivessi la domanda). – Tony

+0

Ho aggiunto gli accessor b/c Non voglio fornire accesso in scrittura ai dati caricati. Probabilmente sarebbe più idiomatico chiamarli solo id e nome. Posso o non posso aver programmato in una lingua senza nome dove quella convenzione di denominazione era standard. :) – Tony

Problemi correlati