Ho un componente che ottiene una raccolta di elementi come oggetti di scena e map
s in una raccolta di componenti resi come figli di un componente padre. Utilizziamo le immagini memorizzate in WebSQL
come matrici di byte. All'interno della funzione map
ottengo un ID immagine dall'elemento e faccio una chiamata asincrona allo DAL
per ottenere l'array di byte per l'immagine. Il mio problema è che non posso propagare la promessa in React, dal momento che non è stato progettato per gestire le promesse di rendering (non per quanto posso dire in ogni caso). Vengo da uno sfondo C#
, quindi suppongo di cercare qualcosa come la parola chiave await
per il codice ramificato resync.Rendering Reagire i componenti con promesse all'interno del metodo di rendering
La funzione map
simile a questa (semplificato):
var items = this.props.items.map(function (item) {
var imageSrc = Utils.getImageUrlById(item.get('ImageId')); // <-- this contains an async call
return (
<MenuItem text={item.get('ItemTitle')}
imageUrl={imageSrc} />
);
});
e il metodo getImageUrlById
assomiglia a questo:
getImageUrlById(imageId) {
return ImageStore.getImageById(imageId).then(function (imageObject) { //<-- getImageById returns a promise
var completeUrl = getLocalImageUrl(imageObject.StandardConImage);
return completeUrl;
});
}
Questo non funziona, ma non so cosa Devo modificare per fare in modo che funzioni. Ho provato ad aggiungere un'altra promessa alla catena, ma poi ricevo un errore perché la mia funzione di rendering restituisce una promessa invece di JSX legale. Stavo pensando che forse ho bisogno di sfruttare uno dei metodi del ciclo di vita React
per recuperare i dati, ma poiché ho bisogno che lo props
sia già lì, non riesco a capire dove posso farlo.
Ok, punto preso. Qualche possibilità di mostrare un esempio? –
Grazie! Questo ha fatto il trucco. L'unica cosa che cambierei qui (almeno per il mio uso) è di farlo in 'componentWillMount' invece di' componentDidMount' per non avere un rendering "vuoto" iniziale. 'componentWillMount' viene eseguito prima del rendering iniziale. –
@Wint C'è un errore su questa riga: 'var newUrls = self.state.imageUrls.slice(). Push (mapping)' perché il valore restituito non è una copia superficiale dell'array ma la lunghezza del nuovo array. Vedi [Array.prototype.push()] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push#Syntax) – jherax