Обещания не соответствуют ионным - PullRequest
0 голосов
/ 01 ноября 2018

Я занимаюсь разработкой приложения с использованием Ionic 4. Итак, для этой конкретной функции я извлекаю записи из базы данных SQLite в телефоне и помещаю их в API. Я использую обещание, чтобы убедиться, что текущие данные уже опубликованы, прежде чем переходить к следующему и так далее. Он работал отлично и вдруг перестал работать.

Я серьезно не знаю, что произошло, так как в моем коде ничего не изменилось. Я надеюсь, что кто-то может мне помочь.

Иногда это работает, но только 2 из 4 или 1 из 4 данных отправляются в БД, а другие возвращают ошибку ERROR: Uncaught (в обещании): [object Object] в Chrome Debugger.

dataPush() {
  this.sqlite.create({
    name: 'database.db',
    location: 'default'
  }).then((db: SQLiteObject) => {
    db.executeSql('SELECT * FROM table', [])
      .then(res => {
        let promise = new Promise((resolve, reject) => {
          for (var i = 0; i < res.rows.length; i++) {
            this.array.push({
              data1: res.rows.item(i).data1,
              data2: res.rows.item(i).data2,
              data3: res.rows.item(i).data3,
              data4: res.rows.item(i).data4,
              data5: res.rows.item(i).data5,
              data6: res.rows.item(i).data6,
              sync: res.rows.item(i).sync
            })

            if (this.array[i].sync == "N") {

              this.http.post("API URL", this.array[i])
                .toPromise()
                .then(
                  res => { // Success
                    console.log(res);
                    resolve();
                  }
                );

            }
          }
        });
        return promise;
      }).catch(e => console.log('Sync Error'));
  }).catch(e => console.log(e));
}

Эта функция доставляет мне проблемы. Надеюсь, кто-нибудь сможет мне помочь. Заранее спасибо.

Приветствия

EDIT Ошибка в том, что он создает дублированный первичный ключ, и mysql не позволяет ему войти в таблицу (таким образом, только один входит, а другие отклоняются). Я установил свой первичный ключ на основе предыдущих ключей и добавлю один к номеру (все сделано в API PHP). По этой причине я реализовал обещание убедиться, что сторона PHP полностью выполнила задачу (вставка данных в базу данных), прежде чем другие данные начнут поступать в API. Есть идеи, почему обещание не работает?

1 Ответ

0 голосов
/ 01 ноября 2018

Для начала создайте свой массив. После того, как все ваши предметы помещены в this.array, вы можете вызвать рекурсивную функцию. Рекурсивная функция должна выглядеть примерно так:

sendToApi(i) {
    this.http.post("API URL", this.array[i])
        .toPromise()
        .then(
          res => { 
            // Success
            console.log(res);
            if (i < this.array.length - 1) {
              // Call it again for the next item
              sendToApi(++i);
            }
          }
        );
}

И чтобы начать, просто позвоните sendToApi(0). Каждый раз, когда .post завершается, он снова вызывает sendToApi, но со следующим номером в последовательности

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