ComponentWillMount ReactJS上的无限循环

时间:2018-05-14 09:49:14

标签: javascript reactjs salesforce

我试图在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
    })
  }

1 个答案:

答案 0 :(得分:0)

Async React将来会更容易,但是现在你需要在你的诺言解决时不阻止渲染。

这是一个高级解决方案:

  1. 停止使用ComponentWillMount。它已被弃用。
  2. 停止使用while循环。它不会与你的诺言一起工作。先让它工作,然后再担心queryMore。见下文。
  3. 在组件状态中添加一个名为" loading"并将其默认为true。
  4. 在你的渲染方法中有一个条件来加载一个微调器(或NULL,或什么东西)当" loading"等于真。
  5. 在ComponentDidMount *中,在检索完所有内容后,调用您的请求逻辑并在传入.then方法的函数中设置WITHIN。确保设置" loading"在那里假。
  6. 渲染中的条件应该呈现内容。
  7. 考虑使用JSForce(https://jsforce.github.io/)连接到您的对象。它已经包含了autoFetch逻辑,可以替换你的queryMore逻辑。

    *使用ComponentDidMount应该可以工作,但这可能是一个坏主意,因为组件将在每次渲染时调用SF。你可能应该使用一个处理程序,只有当你没有状态数据或者你想要因某些其他原因刷新时才会打电话。