React Native .then似乎出现了故障

时间:2019-06-20 08:49:45

标签: javascript react-native

我目前在react native类中具有以下方法,但是我认为这通常适用于JS,但我可能是错的:

  dbGetTemplateOptions = () => {
    let dataArray = [];
    let subcategories = this.state.subcategories;

    subcategories.forEach(item => {
      let getSubValues = new Promise(function(resolve, reject) {
        resolve(item);
      })
      getSubValues.then((item) => this.dbGetValues(item.subCatId))
      getSubValues.then((value) => console.log(2))
    });
  }

根据我对promise的有限js知识,在上面我解决了一个promise并运行getSubValues.then(),这意味着每个.then方法在方法返回后运行。

在上面的代码中,我调用方法dbGetValues(item.subCatId) 这是什么:

  async dbGetValues(subCatId) {
    let subValues = [];
    let result = await db.transaction(tx => {
      tx.executeSql(
        'SELECT * FROM dr_template_relational '
        + ' INNER JOIN  dr_report_categorie_values on dr_report_categorie_values.id = dr_template_relational.value_id'
        + ' WHERE dr_template_relational.subcategory_id = ' + subCatId + ' AND dr_template_relational.template_id = ' + this.state.currentTemplateId,
        [],
      (trans, result) => {
        const sqLiteResults = result.rows._array;

        sqLiteResults.forEach(el => {
          subValues.push({ subCategoryId: subCatId, values: el.value_id, name: el.name, narrative: el.narrative });
        })
      });
    },
    (err) => console.error(err),
    () => {
      console.log(1);
      return subValues;
    }
  );
  return result;
  }

请注意,我的console.log(2)在然后调用方法之后。 在该方法内部,还请注意我有console.log(1)。我希望它们按顺序运行,因为我在等待下一个运行之前等待它完成。我意识到我不正确,因为console.log实际上是。

2
2
1
1

1 个答案:

答案 0 :(得分:1)

  dbGetTemplateOptions = () => {
    let dataArray = [];
    let subcategories = this.state.subcategories;

    subcategories.forEach(item => {
      let getSubValues = new Promise(function(resolve, reject) {
        resolve(item);
      })
      getSubValues.then((item) => this.dbGetValues(item.subCatId))
      getSubValues.then((value) => console.log(2))
    });
  }

在实际调用异步dbGetValues函数之前,您要解决承诺。这就是thendbGetValues的回调之前触发的原因。

在没有更多您想要做的事情的上下文的情况下,很难知道要进行哪些更改,但是我认为您实际上可能想要这样的东西:

  dbGetTemplateOptions = () => {
    let dataArray = [];
    let subcategories = this.state.subcategories;

    subcategories.forEach(item => {
      let getSubValues = new Promise(async (resolve, reject) => {
        const result = await this.dbGetValues(item.subCatId)
        resolve(result);
      })
      getSubValues.then((value) => console.log(2))
    });
  }

或者尝试进一步简化:

  dbGetTemplateOptions = () => {
    let dataArray = [];
    let subcategories = this.state.subcategories;

    subcategories.forEach(async (item) => {
      const result = await this.dbGetValues(item.subCatId)
      // Do something with result here
      console.log(2)
    });
  }

显然,这是基于您所做的假设