我有一個組件,它獲取作爲道具的項目集合以及map
將它們呈現爲作爲父組件的子項呈現的組件集合。我們使用WebSQL
中存儲的圖像作爲字節數組。在map
函數中,我從該項目獲取圖像標識並對DAL
進行異步調用,以獲取圖像的字節數組。我的問題是,我不能將這個承諾傳播給React,因爲它不是用來處理渲染中的承諾(反正我不能說)。我來自C#
背景,所以我想我正在尋找類似await
關鍵字的重新同步分支代碼。在呈現方法中渲染React具有承諾的組件
的map
功能看起來像這樣(簡化):
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} />
);
});
和getImageUrlById
方法是這樣的:
getImageUrlById(imageId) {
return ImageStore.getImageById(imageId).then(function (imageObject) { //<-- getImageById returns a promise
var completeUrl = getLocalImageUrl(imageObject.StandardConImage);
return completeUrl;
});
}
這是不行的,但我不知道是什麼我需要修改才能完成這項工作。我試圖給鏈添加另一個承諾,但後來我得到一個錯誤,因爲我的渲染函數返回一個承諾,而不是合法的JSX。我在想,也許我需要利用其中一種生命週期方法獲取數據,但由於我需要props
已經在那裏,所以我無法弄清楚我可以在哪裏做到這一點。
好的,點了。你有什麼機會展示一個例子? –
謝謝!那就是訣竅。我唯一要改變的地方(至少對我來說是這樣)是在'componentWillMount'而不是'componentDidMount'中執行這個操作,以避免初始的「空白」渲染。 'componentWillMount'在初始渲染之前運行。 –
@Wint這行有一個錯誤:'var newUrls = self.state.imageUrls.slice()。push(mapping)',因爲返回的值不是數組的淺表副本,而是新數組的長度。參見[Array.prototype.push()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push#Syntax) – jherax