我正在使用Ionic 4开发应用程序。因此,对于此特定功能,我正在从电话中的SQLite数据库中获取记录,并将其发布到API。我使用promise来确保在循环到下一个数据之前已经发布了当前数据,依此类推。它运行的很好,突然停止了工作。
我真的不知道发生了什么,因为代码没有任何变化。我希望有人可以帮助我。
有时候,它可以正常工作,但是只有4个数据中的2个或4个数据中的1个被发送到数据库中,而其他数据则返回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之前完全完成了该任务(将数据插入数据库)。为什么诺言不起作用的任何想法?
答案 0 :(得分:1)
首先,构建阵列。将所有项目推入god
后,就可以调用递归函数。递归函数应如下所示:
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
,但顺序中的下一个数字