дождаться обещания, прежде чем обещать все JavaScript - PullRequest
0 голосов
/ 09 марта 2019

У меня есть этот массив обещаний:

return function (dispatch, getState) {

    Promise.all([
        dispatch(getThis()),
        dispatch(getThat()),
        dispatch(getThese()),
        dispatch(getThose()))]
    ).then(() => {
        let state = getState();
        dispatch({
           //dispatch
        });
    }).catch(function (err) {
        console.log(err);
    });
}

Но на самом деле я хочу, чтобы getThis () был завершен перед вызовом любой другой отправки, поскольку все они зависят от возврата getThis (). Как справиться с этим?

Большое спасибо!

РЕДАКТИРОВАТЬ моя функция выглядит следующим образом:

export function getThis() {
    return function (dispatch, getState) {
            return new Promise((resolve, reject) => {
                axios.get('api/this/' + lienBuild).then((response) => {
                    resolve(dispatch({type: "FETCH_THIS", data: response.data}));
            });
        })
    };
}

1 Ответ

1 голос
/ 09 марта 2019

См. Комментарий FrankerZ , очевидно, эта dispatch функция является стандартной вещью Redux (я не использую Redux), и она не возвращает обещание, поэтому использовать ее не имеет смысла. Promise.all на нем.

Но, отвечая на обещание "как мне ждать getThis сначала": просто переместите его в начало цепочки:

return function (dispatch, getState) {
    dispatch(getThis())             // First this, then...
    .then(result => Promise.all([   // ...these
        dispatch(getThat(result)),  // (I've passed the result to all three, but...)
        dispatch(getThese(result)),
        dispatch(getThose(result))
    ]))
    .then(() => {
        let state = getState();
        dispatch({
           //dispatch
        });
    }).catch(function (err) {
        console.log(err);
    });
}

или без dispatch, поскольку, по-видимому, это неправильно:

return function (dispatch, getState) {
    getThis()               // First this, then...
    .then(result => Promise.all([   // ...these
        getThat(result),    // (I've passed the result to all three, but...)
        getThese(result),
        getThose(result)
    ]))
    .then(() => {
        let state = getState();
        dispatch({
           //dispatch
        });
    }).catch(function (err) {
        console.log(err);
    });
}

Примечание по поводу getThis: См. этот вопрос и ответы на него . Нет необходимости в new Promise, когда у вас уже есть обещание. Я не знаю, правильный ли этот код getThis с точки зрения Redux, но вот тот же код, который не использует new Promise без необходимости:

export function getThis() {
    return function(dispatch, getState) {
        return axios.get('api/this/' + lienBuild).then(response => dispatch({type: "FETCH_THIS", data: response.data}));
    };
}

или со свойствами разрушения и сокращения:

export function getThis() {
    return function(dispatch, getState) {
        return axios.get('api/this/' + lienBuild).then(({data}) => dispatch({type: "FETCH_THIS", data}));
    };
}

или, если вы можете использовать async / await:

export function getThis() {
    return async function(dispatch, getState) {
        const {data} = await axios.get('api/this/' + lienBuild);
        return dispatch({type: "FETCH_THIS", data});
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...