【问题标题】:Possible Unhandled Promise Rejection (id: 0) React Native AsyncStorage可能未处理的 Promise Rejection (id: 0) React Native AsyncStorage
【发布时间】:2019-12-22 01:06:16
【问题描述】:

我承诺 React Native AsyncStorage getItem 方法,但我被警告说它可能返回一个未处理的承诺拒绝。这是我在做什么,我的代码有什么问题?

在 App.js 中ComponentDidMount()

componentDidMount() {
  ConnectyCube.init(...config);
  authInitialization = async () => {
    const locallyStoredPhoneNumber = await getStoredPhoneNumber();
    console.log(locallyStoredPhoneNumber);
    authorizeFirebase(this.getFirebaseAccessToken);
    this.props.authorizing(true);
  }
  authInitialization();
}

然后在localStorage.js

export const getStoredPhoneNumber = () => {
  return new Promise((resolve, reject) => {
    AsyncStorage.getItem('@phone_number', (error, result) => {
      result ? resolve(result) : reject(error);
    })
  })
}

提前致谢。

更新

我现在添加了错误处理:

export const getStoredPhoneNumber = () => {
  return new Promise((resolve, reject) => {
    AsyncStorage.getItem('@phone_number', (error, result) => {
      result ? resolve(result) : reject(error);
    })
  }).catch(error => console.error(error))
}

似乎有效 - 这是我的额外逻辑,取决于 AsyncStorage 调用的结果:

componentDidMount() {
  ConnectyCube.init(...config);
  authInitialization = async () => {
    const locallyStoredPhoneNumber = await getStoredPhoneNumber();
    locallyStoredPhoneNumber !== undefined
      ? authorizeFirebase(this.getFirebaseAccessToken) && this.props.authorizing(true)
      : this.setState({ newUser: true })
  }
  authInitialization();
}

【问题讨论】:

  • 我的意思是......在该代码中没有任何地方处理被拒绝的承诺。如果一个承诺被拒绝,而你没有处理它,它就是“未处理”
  • 谢谢@KevinB - 我现在明白了 - 正如你从componentDidMount 中的异步函数中看到的那样,我正在尝试做的是等待AsyncStorage 调用得到解决然后移动通过其余的功能。
  • 然后呢?您仍然没有处理任何可能发生的错误。不管你想做什么,你有没有错误处理的承诺。这就是错误告诉你的全部内容。
  • 所以我在代码中没有try catch 块的原因是因为我试图承诺AsyncStorage 调用的结果,所以我可以制作ComponentDidMount async。也许我的问题应该是我怎样才能实现我刚才描述的。
  • 我在Documentation 中关注SignaturegetItem(key: string, [callback]: ?(error: ?Error, result: ?string) => void): Promise

标签: javascript reactjs react-native async-await asyncstorage


【解决方案1】:

似乎这样应该可以:

async componentDidMount() {
  ConnectyCube.init(...config);
  try {
    const locallyStoredPhoneNumber = await AsyncStorage.getItem('@phone_number');
    locallyStoredPhoneNumber !== undefined
      ? authorizeFirebase(this.getFirebaseAccessToken) && this.props.authorizing(true)
      : this.setState({ newUser: true })
  } catch (e){
    // handle error
  }
}

【讨论】:

  • 感谢@Mike M - 在authorizeFirbasegetFirebaseAccessToken 中最多有五个异步api 调用,其中任何一个都可能失败——它们已经有自己的catch 方法。您的上述解决方案不会降低处理这些失败调用的能力吗?
  • 另外,我们怎么能使用await而不把它变成async函数呢?
  • @tommmmmmmy try/catch 应该捕获从 firebase 抛出的任何错误。我们可以使用await,因为我将componentDidMount 设为异步。
【解决方案2】:

你需要“捕捉”任何可能抛出的错误并处理它们(否则 React 会报错):

componentDidMount() {
  authInitialization = async () => {
    try {
      const locallyStoredPhoneNumber = await getStoredPhoneNumber();
    ...
    } catch (e) {
      console.log(e) //handle error }
    }
    authInitialization();
  }
}

【讨论】:

    【解决方案3】:

    处理 Promise 拒绝的一种方法是使用 try...catch 块来返回你的 Promise。

    try{
        const locallyStoredPhoneNumber = await getStoredPhoneNumber();
    } catch(error){
        //Error handling code here
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2017-01-25
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多