javascript - ComponentWillMount ReactJS 上的无限循环
问题描述
我正在尝试在 Salesforce 上使用 ReactJS,但查询非常有问题
看看这段代码,试图做一些很酷的事情来获取所有数据,但时间并没有停止,不知道为什么,请帮助我,随时问我任何问题
componentWillMount(){
let queryMore = true
let offSet = 0
let contents = []
while(queryMore) {
makeDeferredProvider()
let contentObject = SObjectModel.deferredObject('Content')
let retrieveOptions = {
limit: 10,
where: {
Type__c: { eq: 'Image' }
}
}
offSet > 0 ? retrieveOptions.offset = offSet : ''
let contentPromise = contentObject.retrieve(retrieveOptions)
contentPromise.then( records => {
records.forEach( record => {
let item = {
'name': record.get('Name'),
'id': record.get('Id')
}
contents.push(item)
})
records.length = 10 ? offSet += 10 : queryMore = false
}, error => {
console.log(error)
})
}
this.setState({
contents: contents
})
}
解决方案
Async React 将来会让这更容易,但现在你需要在你的 Promise 解析时不要阻塞渲染。
这是一个高级解决方案:
- 停止使用 ComponentWillMount。它正在被弃用。
- 停止使用 while 循环。它不会与你的承诺一起工作。先让它工作,然后再担心 queryMore 。见下文。
- 在组件状态中添加一个名为“正在加载”的字段,并将其默认为 true。
- 当“加载”等于 true 时,在您的渲染方法中有一个条件来加载微调器(或 NULL 或其他东西)。
- 在 ComponentDidMount* 中,调用您的请求逻辑并在检索所有内容后在传递给 .then 方法的函数内设置状态。确保在此处将“正在加载”设置为 false。
- 然后渲染中的条件应该渲染内容。
考虑使用 JSForce ( https://jsforce.github.io/ ) 连接到您的对象。它已经包含 autoFetch 逻辑,可以替换您的 queryMore 逻辑。
* 使用 ComponentDidMount 应该可以工作,但这可能是个坏主意,因为该组件将在每次渲染时调用 SF。您可能应该使用处理程序,并且仅在您没有处于状态的数据或出于其他原因想要刷新时才调用。
推荐阅读
- awk - 如何使用 awk 计算以某事物开头的单词的出现次数?
- python - 在Django rest框架中过滤给定距离内的用户
- html - 当对象离开屏幕时移动滚动而不会丢失 text-size.adjust 功能
- c# - ToLocalTime 在通用转换中不起作用
- node.js - 节点 - 尝试压缩目录不会做任何事情
- python - 如何通过 Python 在设备上启动 Android 应用程序?
- python - 如何使用python Websocket-client lib传递令牌以连接Websocket API
- ios - 在 iPad 上呈现弹出框时未禁用 SwiftUI 视图交互(iOS 14+)
- excel - 如何从 Excel 发送 WhatsApp 消息:发送图像
- react-native - 如何知道 monitorCharacteristic 何时使用 react native ble plx 完成?