未通过Redux处理的承诺

时间:2019-01-22 21:49:40

标签: javascript reactjs redux

所有数据加载完毕后,我试图执行一些操作,但是我对诺言的处理不当感到麻烦。

export function waitForAll() {
    return function (dispatch, getState) {
        Promise.all([
            dispatch(getCharacteristics()),
            dispatch(getItems())]
        ).then(()=>{
            let state = getState();
             dispatch(update(state))
        }).catch(function(err){
            console.log(err);
        });
    }
}

这是为此诺言而调用的2个函数:

export function getCharacteristics() {
    return function (dispatch) {
        axios.get('api/charac').then((response) =>
        {
            dispatch(fetchCharacteristics(response.data));
        }).catch(error =>{
            console.log(error);
        });
    }
}

export function getItems() {
    return function (dispatch) {
        axios.get('api/45897').then((response) =>
        {
            dispatch(fetchItems(response.data.equipements));
        }).catch(error =>{
            console.log(error);
        });
    }
}

我的状态没有更新,这意味着我的诺言没有得到正确处理,我的初始状态是[]。

一个替代方法可以是React中的componentDidMount()来调用该函数,但是我不确定如何验证两个状态是否正确加载(不同的组件)

我不知道如何使它起作用,欢迎任何帮助!

1 个答案:

答案 0 :(得分:3)

您实际上并没有兑现承诺。安排您的代码以返回承诺(不仅仅是解决承诺),然后您就可以利用Promise.all

示例:

async function promise1 () {
    const promise = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    return promise.json();
};
async function promise2 () {
    const promise = await fetch('https://jsonplaceholder.typicode.com/todos/2');
    return promise.json();
};


async function getAllPromises() {
    const results = await Promise.all([promise1(), promise2()]);
    console.log(results);
};

getAllPromises();

基本上,我认为您可以只返回axios.<httpverb>

示例(最好的猜测,因为我无法运行您的代码):

export function waitForAll() {
    return function (dispatch, getState) {
        Promise.all([
            dispatch(getCharacteristics()),
            dispatch(getItems())]
        ).then(()=>{
            let state = getState();
             dispatch(update(state))
        }).catch(function(err){
            console.log(err);
        });
    }
}

export function getCharacteristics(dispatch) {
    return new Promise ( (resolve, reject) {
        axios.get('api/charac').then((response) =>
        {
            resolve(dispatch(fetchCharacteristics(response.data)));
        }).catch(error =>{
                reject(error);
            console.log(error);
        });
    });
}

export function getItems(dispatch) {
    return new Promise ((resolve, reject)  {
        axios.get('api/45897').then((response) =>
        {
            resolve(dispatch(fetchItems(response.data.equipements)));
        }).catch(error =>{
                reject(error);
            console.log(error);
        });
    });
}