【问题标题】:Promises not consistent Ionic承诺不一致的离子
【发布时间】:2018-11-01 17:02:41
【问题描述】:

我正在使用 Ionic 4 开发一个应用程序。因此,对于这个特定功能,我从手机中的 SQLite 数据库获取记录并将其发布到 API。我使用 promise 来确保当前数据在循环到下一个之前已经发布,依此类推。它工作得很好,突然停止工作。

我真的不知道发生了什么,因为我的代码没有任何变化。我希望有人可以帮助我。

有时,它正在工作,但只有四分之二的数据或四分之一的数据被发送到数据库中,而其他数据则返回 ERROR 错误:未捕获(承诺中):Chrome 调试器中的 [object Object]。

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));
}

这是给我带来问题的功能。希望有人可以帮助我。提前致谢。

干杯

编辑 该错误是因为它创建了一个重复的主键,而 mysql 不允许它进入表(因此只有一个进入,其他被拒绝)。我根据以前的键设置我的主键并将数字加一(全部在 PHP api 中完成)。这就是我实现承诺以确保 PHP 端在其他数据开始进入 api 之前已完全完成任务(将数据插入数据库)的原因。任何想法为什么承诺不起作用?

【问题讨论】:

  • 您能否在您的 .post 承诺中添加一个 .catch 块,并找出未捕获的错误是什么?
  • @user184994 我刚刚检查过。错误是因为如果创建重复的主键并且mysql不允许它进入表。我根据以前的键设置我的主键并将数字加一(全部在 PHP api 中完成)。这就是我实现承诺以确保 php 端在其他数据开始进入 api 之前已完全完成任务(将数据插入数据库)的原因。有什么想法吗?
  • 因为 Promise 是异步的,所以在下一次循环迭代开始之前代码还没有完成执行。与其使用for 循环,不如使用递归
  • 啊,我明白了.. 你能帮我解决递归部分吗.. 以前从未做过递归.. :)

标签: angular typescript ionic-framework angular6 ionic4


【解决方案1】:

首先,建立您的阵列。将所有项目推入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,但会使用序列中的下一个数字

【讨论】:

  • 由于某种原因,这会导致无限循环..它会继续推送第一个数据但无限..嗯..
  • 你确定你有sendToApi(i++);吗?你可以试试sendToApi(i + 1),但不确定它是否会有所作为......
  • 是的..现在尝试..它很奇怪,因为它应该停止,因为我只有 4 个数据..但是它一直持续到 500+..哈哈哈
  • 刚刚尝试过,是的,这样做或sendToApi(++i) 会起作用
  • 哈哈哈刚刚也试过了..一切正常..非常感谢队友..:D
猜你喜欢
  • 2018-06-20
  • 2020-02-10
  • 1970-01-01
  • 2017-10-05
  • 2021-03-13
  • 2018-01-17
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多