账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Promise中使用了for循环后,不能获取到最终结果,如果改为promise.all该如何修改
    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
    打赏
    收藏
    点击回答
        全部回答
    • 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的结果。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部