Это как вы отправляете посылку в Promise? - PullRequest
0 голосов
/ 17 мая 2018

Итак, у меня есть этот фрагмент кода с условием гонки:

    //load token from async and put it in redux's state
    AsyncStorage.getItem('token').then((data) => {
        setTimeout(() => {
            if (data !== null) {
                store.dispatch({ type: t.LOGGED_IN, token: data });  //THIS
                this.setState({ isReady: true, isLoggedIn: true });  //RACING THIS
            }
            else {
                store.dispatch({ type: t.LOGGED_OUT });
                this.setState({ isReady: true, isLoggedIn: false })    
            }
        }, 5000)
    });

Итак, я прочитал о том, как обернуть свою отправку в обещание, чтобы только после отправки я звонил setState внутри обещания .then.

Однако я не мог понять, как использовать обратный вызов resolve для обещания. Вызывает ли это то, что я передаю в resolve, тогда, когда это сделано, оно сообщает объекту обещания, что оно разрешено? Или это говорит о том, что, как только обещание решено, запустите этот кусок кода? Первое имеет больше смысла для меня, поэтому я сделал это с моим кодом:

let promisedDispatch = (actionObj) => new Promise (function(resolve) { resolve(store.dispatch(actionObj)) });

    //load token from async and put it in redux's state
    AsyncStorage.getItem('token').then((data) => {
        setTimeout(() => {
            if (data !== null) {
                promisedDispatch({ type: t.LOGGED_IN, token: data })
                    .then(()=>this.setState({ isReady: true, isLoggedIn: true }))
            }
            else {
                store.dispatch({ type: t.LOGGED_OUT });
                this.setState({ isReady: true, isLoggedIn: false })    
            }
        }, 5000)
    });

Теперь, в этом случае, я действительно решил свою проблему? Я не могу быть уверен, потому что даже до этой модификации состояние гонки ДЕЙСТВИТЕЛЬНО редко доставляет мне какие-либо проблемы, поскольку dispatch и setState занимают примерно одно и то же время, поэтому отправка почти всегда заканчивается первым.

Единственный способ узнать для меня это подтвердить, если resolve(<x>) говорит: «Эй, попробуйте решить, а затем сообщите об этом обещание, когда оно будет выполнено», или если мое понимание совершенно неверно.

Заранее спасибо за информацию! :)

...