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); 
}; 
+0

동기화 방법으로 비동기를 수행하는 것이 불가능합니다. –

+0

죄송합니다 - 질문을 잘못 읽었습니다! 내 대답은 업데이 트되었습니다 :) –

+0

내가 대답하기 전에 뭔가를 확인하자 ... 그래서'stackNavigator.router.getStateForAction = (action, state)'는 async'를 사용할 수 없습니까? 예 :'stackNavigator.router.getStateForAction = async (action, state)'? – ReyHaynes

답변

0

빠른 & 더러운 : 당신은 그냥 폴링 기능으로 foo()를 돌 수 있었다.

모든 빈번히 폴링하는 setInterval을 만들고 약속이 해결되면 f()으로 업데이트되는 값을 확인하십시오.

편집 :

미안 해요, 나는 내가 질문을 오해 생각합니다. 너 캔트 그것을 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 
    } 
} 
0

. 작동하는 데 (즉 네트워크 요청을 말하면서) 앱의 다른 부분이 작동하려면 해당 데이터가 필요하다면 두 가지 선택 만 할 수 있습니다. 모든 것을 중단하고 대기 (비동기/대기)하거나, 앱이 데이터없이 정상적으로 계속 진행할 수 있도록 한 다음 사용 가능 해지면 자동으로 업데이트합니다. 두 옵션 모두 훌륭하며, 정확히 무엇을 하려는지에 달려 있습니다.

React/React 네이티브 응용 프로그램에서 두 번째 옵션은 네트워크 요청에서 데이터가 돌아 오기를 기다리는 UI가있는 경우에 자주 사용됩니다. 요청하는 동안 UI를 고정하는 대신 데이터가 전송된다고 알리는 메시지를 UI에 렌더링합니다. 비동기 함수에서 약속이 해결되면 환자 UI가 읽을 수있는 위치에 데이터를 저장해야합니다. Redux 또는 Mobx와 같은 상태 관리 시스템이 들어 와서 데이터를 저장할 장소를 제공 한 다음 준비가되었다는 사실을 사용자에게 알리기 위해 이벤트를 전달하고 이제는 모든 멋진 데이터로 다시 렌더링 할 수 있습니다.

희망은 어떤면에서 도움이됩니다.

+0

Redux를 사용하고 있지만 사실 getStateForAction() 상태를 얻는 방법을 모르겠습니다. 내가 그것을 (또는 어떻게하는지) 알 수 있다면 그것은 내 문제를 해결할 것이다. – Niklaus

+0

오, 나는 사용자가 로그인했는지 알아야하는 모든 화면에 is-user-logged-logic을 추가하는 것을 피하려고합니다. 라우터에서 그렇게하고 싶습니다. 그래서 내 화면이 사실에 의존 할 수 있습니다. 해당 사용자가 로그인되어 있습니다. – Niklaus

+0

당신이해야 할 일은 구성 요소의 상태를 듣는 것입니다. 당신은 componentRillRecieveProps lifecycle 메소드를 사용하여이를 수행합니다. 이 방법을 사용하면 주정부의 모습을 얻을 수 있습니다. 그런 다음 상태 조각이 사용 가능한지 여부를 확인하고 필요한 경우 수행 할 수 있는지 여부를 확인할 수 있습니다. –