【问题标题】:async await with promises is then block required然后需要阻止带有承诺的异步等待
【发布时间】:2019-05-21 13:17:51
【问题描述】:

如何正确地基本上异步等待?我为 AsyncStorage 创建了一个帮助器,它会自动等待异步,但它的用户是否也必须使用 async await 或承诺方法来获得价值?

此代码有效,但无法正确使用语法。

这是我的代码:

class AsyncStorageHelper {
  static getItem = async (key: string) => {
    let value: any = "";
    try {
      value = await AsyncStorage.getItem(key);
    } catch (error) {
      console.log(`Error item: ${value}`);
      throw new Error(`Error ${value}`);
    }
    return value;
  };
}

AsyncStorageHelper.getItem("logins")
  .then(result => {
    if (result) {
      if (result === "1") {
        navigate(SCREEN1);
      } else {
        navigate(SCREEN2);
      }
    }
  })
  .catch(err => {
    navigate(LOGINSCREEN);
  });

如何将AsyncStorageHelper 代码转换为异步等待,具体取决于我想要导航到不同位置的结果。

【问题讨论】:

  • 异步函数返回承诺,所以是的,函数的调用者必须将返回值视为承诺。 (这是你的问题吗?)

标签: javascript react-native ecmascript-6 async-await es6-promise


【解决方案1】:

await 必须在异步函数中使用。

async function helper() {
  try {
    const result = await AsyncStorageHelper.getItem("logins");

    if (result) {
      if (result === "1") {
        navigate(SCREEN1);
      } else {
        navigate(SCREEN2);
      }
    }
  } catch (error) {
    navigate(LOGINSCREEN);
  }
}

helper()

【讨论】:

    【解决方案2】:

    异步函数和promise-returning函数可以以相同的方式在外部使用。

    AsyncStorageHelper.getItem("logins")
      .then(result => {
        if (result) {
          if (result === "1") {
            navigate(SCREEN1);
          } else {
            navigate(SCREEN2);
          }
        }
      })
      .catch(err => {
        navigate(LOGINSCREEN);
      });
    

    等同于:

    // note: this code must run in another async function
    // so we can use the keyword await
    try {
      const result = await AsyncStorageHelper.getItem("logins");
      if (result) {
        if (result === "1") {
          navigate(SCREEN1);
        } else {
          navigate(SCREEN2);
        }
      }
    } catch (err) {
      navigate(LOGINSCREEN);
    }
    

    注意:您的代码有一个未知的代码路径。当AsyncStorageHelper.getItem("logins") 返回一个假值时会发生什么?您基本上有一个 noop,这可能不是所需的行为。

    【讨论】:

      【解决方案3】:
      class AsyncStorageHelper {
      
        static async getItem(key : string) {
          let value: any = ""
          try {
            value = await AsyncStorage.getItem(key)
          } catch (error) {
            console.log(`Error item: ${value}`)
            throw new Error(`Error ${value}`)
          }
          return value
        }
      }
      
      try {
        const result = await AsyncStorageHelper.getItem("logins")
      
        if (result)
          (result === "1") ? navigate(SCREEN1): navigate(SCREEN2)
      
      } catch(err) {
        navigate(LOGINSCREEN)
      }
      

      【讨论】:

        猜你喜欢
        • 2017-06-15
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        • 2018-02-03
        • 2018-03-05
        • 1970-01-01
        相关资源
        最近更新 更多