Как запустить рассылку после завершения предыдущих - PullRequest
0 голосов
/ 18 декабря 2018

Прежде всего, поблагодарите меня за чтение моего вопроса и попробуйте помочь мне и извиниться за мой английский.

Я использую redux и redux-thunk, и я хотел бы запустить несколько рассылок на redux.Чтобы быть более точным, я хотел бы запустить рассылку после того, как предыдущая закончится.

Моя проблема в том, что я не знаю, как сделать это без выборки.

Например: запуск отправки 1 -> заканчиваетсяdispatch1 -> запуск dispatch2

Вот мой код:

static moveLayer(layerSelected, direction) {
    const mapLayers = [... AxisStore.getStore().getState().map.mapGLlayers];
    const ids = mapLayers.map(l => l.id);
    const index = ids.indexOf(layerSelected.id);
    let newIndex = direction === 'down' ? index - 1 : index + 1;

    let layerUpdated = Object.assign({}, mapLayers[index], {
        redraw: false
    });
    let oldPositionLayer = Object.assign({}, mapLayers[newIndex], {
        redraw: false
    });

    if (direction === 'down') {
        mapLayers.splice(newIndex, 2, layerUpdated, oldPositionLayer);
    } else {
        mapLayers.splice(index, 2, oldPositionLayer, layerUpdated);
    }

    return (dispatch) => {
        dispatch({
            type: MapTypeConstants.SET_MAP_LAYERS,
            payload: mapLayers
        });
    };
}

static updateBefore(layer) {
    let mapLayers = [... AxisStore.getStore().getState().map.mapGLlayers];
    const ids = mapLayers.map(l => l.id);
    const posInRedux = ids.indexOf(layer.id);
    let nextVisibleLayer = mapLayers.find((layerObj, idx) => idx > posInRedux && layerObj.layout && layerObj.layout.visibility && layerObj.layout.visibility === 'visible');
    mapLayers[posInRedux].before = (nextVisibleLayer) ? String(nextVisibleLayer.id) : undefined;
    mapLayers[posInRedux].redraw = (mapLayers[posInRedux].layout.visibility === 'visible') ? true : false;
    return (dispatch) => {
        dispatch({
            type: MapTypeConstants.SET_MAP_LAYERS,
            payload: mapLayers
        });
    };
}

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вы можете попробовать redux-loop , который делает именно то, что вы просили.

Порт архитектуры Elm для Redux, который позволяет вам упорядочивать свои эффекты естественным образоми просто возвращая их из ваших редукторов.

0 голосов
/ 18 декабря 2018

Чтобы дождаться завершения асинхронного вызова, вы можете использовать ключевое слово JS await.При использовании этого ключевого слова ваш код будет приостанавливаться до тех пор, пока не будет завершен вызов, который вы вызвали, теперь ваша функция должна также стать async:

myFunction = async () => {
    await dispatch({})
    dispatch({})
}

Ваша вторая отправка не будет вызвана, если первая не имеетзаконченный.

Это ваш единственный способ, см. Комментарий ниже

Второй вариант - использовать Promise.all.Он выполнит массив Обещаний в том порядке, в котором вы их отправили:

myFunction = async () => {
    await Promises.all([
        dispatch({}),
        dispatch({})
    ])
}
...