回调中的JS范围无法正常运行

时间:2019-06-17 20:17:38

标签: javascript

我目前有以下代码。

  dbSetOrderTemplate(tx) {

    tx.executeSql('SELECT * FROM dr_template_relational WHERE template_id = (?)', [this.state.currentTemplateId],
    (trans, result) => {

      let currentOption;
      const resultValue = result.rows._array;
      let categories = [];

      resultValue.forEach(function (item, index) {
        if(currentOption != item.categories_id) {
          // looping through results to get each item in sqlite db
          tx.executeSql('SELECT * FROM dr_report_categories WHERE id = (?)', [item.categories_id],
          (transCat, catResult) => {
            categories.push(catResult.rows._array[0].name);
          });
          console.log(categories);
        }
        currentOption = item.categories_id;
      });
    },
    (err) => console.error(err)
    );

  }

上面的代码运行,并从本地sqlite数据库中选择一组项目。因此,在第一个'SELECT * FROM dr_template_relational WHERE template_id = (?)'中,我选择一个数组,然后传递给const resultValue。然后在resultValue上执行forEach循环遍历每个项目,然后我的目标是将其推入可变类别。

当前声明的变量中的

类别未插入。显然,范围存在问题,但我不知道为什么。

我声明:let categories = [];然后我运行我的foreach,然后执行另一个名为tx.executeSql的函数。 tx.executeSql是Expo内部的一个本机反应方法。我希望category.push会推送到外部变量。

这有效,并为我提供了一个被推送的数组的console.log:

  (transCat, catResult) => {
    categories.push(catResult.rows._array[0].name);
    console.log(categories);
  }

但是如果我退出tx.executeSql方法:

  tx.executeSql('SELECT * FROM dr_report_categories WHERE id = (?)', [item.categories_id],
  (transCat, catResult) => {
    categories.push(catResult.rows._array[0].name);
  });
  console.log(categories);

这显示console.log Array [];

如果方法未读取类别,则类别应导致未定义的错误,不是吗?我无法弄清楚我在做什么错。请指教,谢谢!

0 个答案:

没有答案