2016-04-15 7 views
5

Ho una semplice sottoscrizione Meteor e visualizzo un messaggio di caricamento mentre i dati vengono caricati. Ma non so come visualizzare il messaggio di errore se l'abbonamento fallisce.Meteor 1.3 + React: rileva l'insuccesso della sottoscrizione?

export const MyAwesomeComponent = createContainer(() => { 
    let sub = Meteor.subscribe('some-data'); 
    if (!sub.ready()) return { message: 'Loading...'}; 
    if (sub.failed()) return { message: 'Failed.' }; // How to do this? 
    return { 
    data: Data.find().fetch() 
    } 
}, MyInternalRenderComponent); 

problema è, l'oggetto di sottoscrizione non ha un metodo failed(), solo una query ready(). Come passare l'errore di un abbonamento come oggetti di scena in un metodo createContainer()?

So che il metodo Meteor.subscribe ha un callback onStop per questo caso, ma non so come incollarlo insieme per passare una proprietà.

+0

Gli abbonamenti non hanno uno stato non riuscito, forniscono solo un set di dati per la copia del database client. Immagino che tu voglia fornire i dati solo se viene soddisfatta una determinata condizione. In questo caso, controlla la condizione in modo indipendente, ad esempio creando un metodo. –

+0

Devono avere uno stato non riuscito. Cosa succede se ho sbagliato a digitare il nome della pubblicazione e non esiste tale pubblicazione? – aedm

+0

Quindi il callback 'onStop' viene chiamato con un oggetto error. –

risposta

0

Dopo molte ricerche sono riuscito a farlo funzionare e penso che risponda alla tua domanda.

Tieni presente che sto utilizzando Meteor 1.6, ma dovrebbe fornirti le informazioni per farlo funzionare al tuo fianco.

Sulla pubblicazione/pubblicare:

try { 
    // get the data and add it to the publication 
    ... 
    self.ready(); 
    } catch (exception) { 
    logger.error(exception); 
    // send the exception to the client through the publication 
    this.error(new Meteor.Error('500', 'Error getting data from API', exception)); 
    } 

Sulla componente UI:

const errorFromApi = new ReactiveVar(); 

export default withTracker(({ match }) => { 
    const companyId = match.params._id; 
    let subscription; 

    if (!errorFromApi.get()) { 
    subscription = Meteor.subscribe('company.view', companyId, { 
     onStop: function (e) { 
     errorFromApi.set(e); 
     } 
    }); 
    } else { 
    subscription = { 
     ready:() => { 
     return false; 
     } 
    }; 
    } 

    return { 
    loading: !subscription.ready(), 
    company: Companies.findOne(companyId), 
    error: errorFromApi.get() 
    }; 
})(CompanyView); 

Da qui tutto quello che dovete fare è ottenere l'elica di errore e rendere il componente, se lo desideri.

Questa è la struttura del cavalletto error (ricevuto sulla onStop richiamata da subscribe):

{ 
    error: String, 
    reason: String, 
    details: String 
} 

[Edit]

Il motivo non v'è un condizionale intorno Meteor.subscribe() è quello di evitare una fastidioso ciclo infinito che si otterrebbe dagli aggiornamenti naturali withTracker(), che causerebbero nuovi abbonamenti/nuovi errori dalla pubblicazione e così via.