【发布时间】: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