0

我正在编写一个 React Native 应用程序。有没有办法在返回值之前解决非异步函数中的 Promise?

样本:

const f = () => {
  return new Promise((resolve) => {
    resolve('baz')
  })
}

const foo = () => {
  const a = f() // a is now a Promise
  return a
};

console.log(foo) // `foo` is a Promise, I need 'baz'

我想找到一种方法来获取已解析的值f,但我无法进行foo()异步。有没有办法做到这一点?如果没有,任何想法如何解决这个问题?

这是我经过一些清理的真实代码:

const stackNavigator = new StackNavigator(...)
const defaultGetStateForAction = stackNavigator.router.getStateForAction

stackNavigator.router.getStateForAction = (action, state) => {

  let screenToRequest = undefined
  let defaultState = undefined

  const isInitial = action.type === 'Navigation/INIT'

  if (isInitial) {
    defaultState = MainTabs.router.getStateForAction('Navigation/INIT')
    screenToRequest = defaultState.routes[defaultState.index].routeName
  } else if (action.type === 'Navigation/NAVIGATE') {
    screenToRequest = action.routeName
  }

  if (screenToRequest) {
    const screen = screens.getScreen(screenToRequest)

    /**
     * If screen requires login, check if user is logged in
     */
    if (screen.screen.loginRequired) {
      /**
       * Here I would like to read data from AsyncStorage with
       * `await` but that's not possible due to this function
       * not being `async` and it cannot be since router does not
       * seem to support it.
       *
       * getSession() reads data from AsyncStorage. If I could
       * `await getSession()`, I would not have a problem.
       */
       const session = getSession()

       // Use `session` to determine if user is logged and act accordingly
    }
  }

  return defaultGetStateForAction(action, state);
};
4

2 回答 2

0

又快又脏:你可以foo()变成一个轮询函数。

只需创建一个setInterval每隔一段时间进行一次轮询并检查f()在 Promise 解决时更新的值。

编辑:

对不起,我想我误读了你的问题。你做不到async。_ 那么,你可以这样做:

const foo = async () =>{
  await const a = f() // a is now a Promise
  return a // a will not be returned until f() resolves
};

这将使函数同步(阻塞)。await当你调用它时,如果你需要保持同步,你也会想要它:

{
  bar: async () =>{
    await foo();
    return; // dont return until foo() resolves
  }
}
于 2017-12-14T06:37:55.853 回答
0

感觉你可能想重新考虑一下你的架构。如果您正在执行应用程序的其他部分需要该数据才能运行的操作(比如说网络请求),那么您只有两个选择。您可以停止一切并等待(异步/等待),或者您可以让您的应用程序在没有该数据的情况下优雅地继续,然后在它可用时自行更新。这两种选择都很棒,它只取决于你到底想要做什么。

在 React/React Native 应用程序中,当您的 UI 正在等待从网络请求中返回数据时,会经常使用第二个选项。当您发出请求时,您不会冻结 UI,而是使用一些表示数据即将到来的消息来呈现 UI。当 promise 被解决时,在你的 async 函数中,你必须把数据放在你的病人 UI 可以读取的地方。这就是 Redux 或 Mobx 等状态管理系统的用武之地。它们为您提供存储数据的地方,然后它们调度事件以提醒您的 UI 已准备好,您现在可以使用所有漂亮的数据重新渲染。

希望在某种程度上有所帮助。

于 2017-12-14T07:01:03.720 回答