代码之家  ›  专栏  ›  技术社区  ›  Toby Weed

从axios调用响应redux设置初始状态

  •  3
  • Toby Weed  · 技术社区  · 7 年前

    我有一个使用redux和axios的react应用程序。我不希望在从服务器获取一些信息之前呈现任何内容,我正在通过axios检索这些信息。

    我认为最好的方法是基于那个axios调用初始化redux状态。

    但是,我的函数似乎没有为状态初始化及时返回任何内容…

    function getUserData() {
        if (Auth.loggedIn()) { //leaving this here bc it could be important; Auth is another class and loggedIn returns a boolean
            axios.get('/route').then(res => {
                console.log(res.data); //This prints the right thing (an object)
                return res.data;
            });
        } else {
            return ' '; //This works fine; state gets initialized to ' '
        }
    }
    
        let userData = getUserData();
        console.log(userData); //When getUserData() returns ' ', this prints ' '. However, when getUserData() returns my object, this prints undefined.
    
        const initialState = {
            userData: userData
        };
    

    我意识到这可能是因为getuserdata()是异步的,并且console.log(userdata)在getuserdata()完成之前运行。但是,我试着:

    getUserData().then(function(userData) {
         console.log(userData);
    });
    

    并收到“typeerror:无法读取属性”then“of undefined”。我的函数显然没有返回承诺,所以这不意味着它不是异步的吗?

    有什么想法吗?

    或者,有更好的方法来做这个吗?我总是可以设置初始状态,然后立即更改它,并使渲染等待更改完成,使用条件渲染,但这显然看起来更糟。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Toby Weed    7 年前

    你必须履行你的诺言 getUserData 函数并使用访问它 .then() .

    function getUserData() {
      return new Promise((resolve, reject) => {
        if (Auth.loggedIn()) {
          axios.get('/route')
            .then(res => resolve(res.data))
            .catch(err => reject(err));
        } else {
          resolve(' ');
        }
      });
    };
    
    getUserData().then(function(userData) {
      const initialState = {
        userData: userData, // ' ' or axios result
      };
      console.log(initialState.userData)
    });