我有一个组件,该组件获取作为道具的项目map集合,并将其作为呈现为父组件子项的组件集合。我们使用WebSQL以字节数组形式存储的图像。在map函数中,我从项目中获取图像ID,并异步调用,DAL以获取图像的字节数组。我的问题是我不能将诺言传播到React中,因为它不是设计来处理渲染中的诺言的(无论如何我还是不能说的)。我来自C#背景,所以我猜我在寻找类似await关键字的内容来重新同步分支代码。
map
WebSQL
DAL
C#
await
该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
getImageUrlById(imageId) { return ImageStore.getImageById(imageId).then(function (imageObject) { //<-- getImageById returns a promise var completeUrl = getLocalImageUrl(imageObject.StandardConImage); return completeUrl; }); }
这是行不通的,但是我不知道需要进行哪些修改才能使其正常工作。我尝试向链中添加另一个Promise,但是由于我的render函数返回一个Promise而不是合法的JSX,因此出现错误。我当时在想,也许我需要利用一种React生命周期方法来获取数据,但是由于我需要props已经存在该方法,所以我不知道该在哪里进行操作。
React
props
render()方法应该从渲染UI this.props和this.state,所以异步加载数据,则可以使用this.state存储imageId: imageUrl的映射。
render()
this.props
this.state
imageId: imageUrl
然后,在您的componentDidMount()方法中,您可以imageUrl从填充imageId。然后,render()通过渲染this.state对象, 该方法应该是纯粹而简单的
componentDidMount()
imageUrl
imageId
请注意,this.state.imageUrls异步填充了,因此渲染的图像列表项在获取其网址后将一一显示。您还可以this.state.imageUrls使用所有图片ID或索引(不带网址)初始化,这样您可以在加载图片时显示加载器。
this.state.imageUrls
constructor(props) { super(props) this.state = { imageUrls: [] }; } componentDidMount() { this.props.items.map((item) => { ImageStore.getImageById(item.imageId).then(image => { const mapping = {id: item.imageId, url: image.url}; const newUrls = this.state.imageUrls.slice(); newUrls.push(mapping); this.setState({ imageUrls: newUrls }); }) }); } render() { return ( <div> {this.state.imageUrls.map(mapping => ( <div>id: {mapping.id}, url: {mapping.url}</div> ))} </div> ); }