Бесконечный цикл в ComponentWillMount ReactJS - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь использовать ReactJS в Salesforce, но запросы довольно проблематичны

Взгляните на этот код, пытаясь сделать что-то классное, чтобы получить все данные, но пока это не остановка, не так ли?не знаю почему, пожалуйста, помогите мне и не стесняйтесь спрашивать меня что-нибудь

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 голосов
/ 14 мая 2018

Async React сделает это проще в будущем, но сейчас вам не нужно блокировать рендеринг, пока ваше обещание разрешается.

Вот решение высокого уровня:

  1. Прекратите использовать ComponentWillMount.Это устарело.
  2. Прекратите использование цикла while.Это не сработает с твоим обещанием.Сначала запустите его, а потом беспокойтесь о queryMore.См. Ниже.
  3. Добавьте поле в состоянии компонента, называемое «загрузка», и установите по умолчанию его значение true.
  4. В методе рендеринга есть условное условие для загрузки счетчика (или NULL, или чего-то еще)когда «загрузка» равна истине.
  5. В ComponentDidMount * вызовите логику запроса и задайте состояние WITHIN функции, переданной в метод .then после получения всего содержимого.Убедитесь, что для «loading» установлено значение false.
  6. Условие рендеринга должно затем отображать содержимое.

Рассмотрите возможность использования JSForce (https://jsforce.github.io/) для подключения к вашемуобъект. В него уже включена логика autoFetch, которая может заменить логику queryMore.

* Использование ComponentDidMount должно работать, но, вероятно, это плохая идея, поскольку компонент будет вызывать SF при каждом рендеринге. Возможно, вам следует использовать обработчики звоните только тогда, когда у вас нет данных в состоянии или если вы хотите обновить по какой-либо другой причине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...