TypeError: недопустимая попытка распространить не повторяемый экземпляр - PullRequest
0 голосов
/ 01 января 2019

После компиляции на Android и загрузки через Store, я получаю сообщение об ошибке:

"TypeError: Invalid attempt to spread non-iterable instance"

Но использование «act-native run-android »не создает сообщения об ошибке, поэтому я не могу найти хороший способ отладкиэто.

fetch(url)
  .then(response => response.json())
  .then(response => {
    if (this._mounted) {
      // let dataSource = this.state.articlesDataSource.cloneWithRows(response.data || [])
      //var rowCount = dataSource.getRowCount();
      var rowCount = Object.keys(response.data).length;

      if (refresh == true) {
        prevData = {};
      } else {
        prevData = this.state.articlesData;
      }
      if (propSearch == "" || propSearch == null) {
        newArticlesData = [...prevData, ...response.data];
      } else {
        newArticlesData = response.data;
      }
      if (response.meta.next_page != null) {
        var rowCount = true;
      } else {
        var rowCount = Object.keys(newArticlesData).length;
      }
      if (this._mounted) {
        this.setState({
          isLoading: false,
          //articlesDataSource: this.state.articlesDataSource.cloneWithRows(response.data),
          articlesData: newArticlesData,
          nextPage: response.meta.next_page,
          fetchUrl: url,
          rowCount: rowCount
        });
      }
    }
  })
  .catch(error => {
    this.setState({
      errorFound: true,
      errorMassage: error,
      isLoading: false
    }); 
});

Спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Я удалил prevData и заменил его данными this.state.articlesData.Я также изменяю логику, поэтому в начале, когда articleData пуст, он не объединяет два объекта, а просто использует response.data.

if(propSearch=="" || propSearch==null && this.state.currentPage!=1 && refresh!=true){
    newData=[...this.state.articlesData,...response.data]
}
else{
    newData=response.data
}

this.state.currentPage! = 1 в значительной степенитак же, как oldData! = empty

Теперь работает.

0 голосов
/ 18 мая 2019

Я получал этот сбой только в релизной сборке Android.релиз ios build и отладка android build работают отлично.

Потратив несколько часов на поиск решений в интернете.

отредактируйте свой .babelrc и добавьте в свои плагины следующее

[
      "@babel/plugin-transform-spread",
      {
        "loose": true
      }
    ]

так вот мой .babelrcfile

{
  "presets": [
    "module:metro-react-native-babel-preset"
  ],
  "plugins": [
    "syntax-trailing-function-commas",
    "@babel/plugin-transform-flow-strip-types",
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-transform-regenerator",
    "@babel/plugin-transform-async-to-generator",
    "@babel/plugin-transform-runtime",
    [
      "@babel/plugin-transform-spread",
      {
        "loose": true
      }
    ]
  ],
  "sourceMaps": true
}

Надеюсь, этот ответ кому-нибудь поможет и сэкономит несколько часов :)

0 голосов
/ 01 января 2019

Это потому, что это ошибка времени выполнения, а не ошибка времени компиляции.

Есть ли номер строки, связанный с ошибкой?Исходя из вопроса об операторе спреда, я предполагаю, что это следующая строка: newArticlesData=[...prevData,...response.data].Я предполагаю, что ваш prevData повторяется, но ваши данные ответа?Попробуйте newArticlesData=[...prevData, response.data]?

Вот пример неправильного использования оператора спреда:

function trySpread(object) {
  let array;
  try {
    array = [...object];
    console.log('No error', array);
  } catch(error) {
    console.log('error', error);
  }
}

// error
trySpread({});
trySpread({foo: 'bar'});
trySpread(4);

// no error
trySpread([]);
trySpread(['foobar']);
trySpread('foobar');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...