- 54
- 0
如下代码,我其中使用了多次读取数据库,并且获取到的数据在进行循环,循环后在进行数据库查询,最终resolve后,我得到的结果仅仅只是一小部分数据,还剩余一部分数据并未resolve,但是通过console.log可以打印出所有数据,resolv执行的时候,其实for循环还未执行完
getProducts(params) {
return new Promise((resolve, reject) => {
if (params) {
this.getDb().then((db: SQLiteObject) => {
db.transaction((run) => {
var sql = 'SELECT * FROM product_content';
run.executeSql(sql, [],
(run, res) => {
if (res.rows.length != 0) {
let result = {
product_ids: {}
};
let retTmp = []
let exTmp = [1,2,100,600,500,800,900,700,701,300]
let categoryIds = []
for (var i = 0; i < res.rows.length; i++) {
var product = res.rows.item(i);
categoryIds.push(product.categoryIds)
for (var k = 0; k < categoryIds.length; k++) {
var _cid = categoryIds[k]
sql = 'select id FROM product where category like "%,' + _cid + ',%"';
run.executeSql(sql, [],
(run, res_id) => {
if (res_id.rows.length != 0) {
for (var i = 0; i < res_id.rows.length; i++) {
var productId = res_id.rows.item(i).ID
retTmp.push(productId)
}
}
})
}
}
// setTimeout(() => {
let newRetTmp = Array.from(new Set(retTmp))
let newExTmp = Array.from(new Set())
if (newExTmp.length > 0) {
newRetTmp.map((rettmp, index) => {
exTmp.map(extmp => {
if (rettmp != extmp) {
result.product_ids[newRet] = true
}
})
})
}
resolve(result);
// }, 500)
} else {
let result = {
data: {
product_ids: {}
}
};
resolve(result);
}
})
})
})
}
})
}
之前在网上看到使用Promise.all()的方法,我将其修改成如下代码,代码看上去没有什么问题,但是一到Promise.all的地方就一直没有resolve了:
getProducts(params) {
return new Promise((resolve, reject) => {
if (params) {
this.getDb().then((db: SQLiteObject) => {
db.transaction((run) => {
var sql = 'SELECT * FROM product_content';
run.executeSql(sql, [],
(run, res) => {
if (res.rows.length != 0) {
let result = {
product_ids: {}
};
let retTmp = []
let exTmp = [1,2,100,600,500,800,900,700,701,300]
let categoryIds = []
let promise = []
for (var i = 0; i < res.rows.length; i++) {
promise.push(new Promise((resolve,reject)=>{
var product = res.rows.item(i);
categoryIds.push(product.categoryIds)
for (var k = 0; k < categoryIds.length; k++) {
var _cid = categoryIds[k]
sql = 'select id FROM product where category like "%,' + _cid + ',%"';
run.executeSql(sql, [],
(run, res_id) => {
if (res_id.rows.length != 0) {
for (var i = 0; i < res_id.rows.length; i++) {
var productId = res_id.rows.item(i).ID
retTmp.push(productId)
// this.helperService.console('c0', productId)
}
}
})
}
}))
}
Promise.all(promise).then(res => {
// setTimeout(() => {
let ATmp = Array.from(new Set(retTmp))
if (newExTmp.length > 0) {
exTmp.map((rettmp, index) => {
newExTmp.map(extmp => {
if (rettmp != extmp) {
result.product_ids[newRet] = true
}
})
})
}
resolve(result);
// }, 500)
})
} else {
let result = {
data: {
product_ids: {}
}
};
resolve(result);
}
})
})
})
}
})
}
根据以上代码,都无法得到想要的结果,第二种方法更是一直处于pendding状态,真不知道该如何进行解决,望各位大神支招
- 共 0 条
- 全部回答
-
Endoftheplay. 普通会员 1楼
在Promise中,如果for循环后无法获取到最终结果,可能是因为Promise中的所有回调函数都被阻塞了,无法获取到后续的执行结果。为了解决这个问题,你可以使用Promise.all来异步处理多个Promise。
以下是一个使用Promise.all的例子:
```javascript let promises = [ // 这里是你的第一个Promise new Promise((resolve, reject) => { setTimeout(() => { resolve('Promise 1 resolved'); }, 1000); }), // 这里是你的第二个Promise new Promise((resolve, reject) => { setTimeout(() => { resolve('Promise 2 resolved'); }, 2000); }) ];
Promise.all(promises) .then((results) => { console.log(results); // 输出:Promise 1 resolved,Promise 2 resolved }) .catch((error) => { console.error(error); // 输出:Promise 1 rejected,Promise 2 rejected }); ```
在这个例子中,我们创建了两个Promise,然后使用Promise.all来异步处理这两个Promise。Promise.all的第三个参数是一个函数,这个函数会在所有Promise都成功或者都失败时被调用。在这个例子中,我们只关心Promise1和Promise2是否都成功,所以我们传递了一个空函数作为第三个参数。当Promise1和Promise2都成功时,Promise.all会返回一个新的Promise,这个新的Promise会解析为两个Promise1和Promise2的结果。如果Promise1失败或者Promise2失败,Promise.all会返回一个新的Promise,这个新的Promise会解析为Promise1的结果。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
