Подтвердить что ты не робот

Возврат товара из магазина после отправки

//EDITED FOR CLARITY

Я пытаюсь связать рассылки с сокращением

function simple_action(){
  return {type: "SIMPLE_ACTION"}
}

export function async_action(){
  return function(dispatch, getState){
    return dispatch(simple_action).then(()=>{...});
  }
}

Как мне получить отправку, чтобы вернуть обещание из магазина?

//БОЛЕЕ СПЕЦИФИЧЕСКИ

Я, вероятно, просто не понимаю что-то здесь, но во всех примерах с thunk-redux они называют отдельное событие async (например, fetch), которое, очевидно, возвращает обещание. То, что я специально ищу, - это когда я отправляю действие в хранилище, как я могу убедиться, что хранилище обработало это действие полностью, прежде чем что-либо еще произойдет в функции action_creator() выше.

В идеале я хотел бы, чтобы в магазине возвращались какие-то обещания, но я не понимаю, как и где это происходит?

4b9b3361

Ответ 1

Здесь у вас есть пример того, как отправлять и переадресовывать асинхронные действия. https://github.com/gaearon/redux-thunk

Средство промежуточного уровня thunk знает, как превратить асинхронные действия thunk в действия, поэтому вам просто нужно, чтобы ваш simple_action() был thunk, а промежуточное ПО thunk выполнит эту работу для вас, если промежуточное программное обеспечение увидит нормальное действие, он отправит это действие как нормальное действие, но если оно будет асинхронным, оно превратит ваше асинхронное действие в нормальное действие.

Итак, ваш simple_action должен быть thunk (A thunk - это функция, которая возвращает функцию.) Например, это:

function makeASandwichWithSecretSauce(forPerson) {
  return function (dispatch) {
    return fetchSecretSauce().then(
      sauce => dispatch(makeASandwich(forPerson, sauce)),
      error => dispatch(apologize('The Sandwich Shop', forPerson, error))
    );
  };
}

При использовании функции makeASandwichWithSecretSauce вы можете использовать функцию отправки

store.dispatch(
  makeASandwichWithSecretSauce('Me')
);

И даже

// It even takes care to return the thunk’s return value
// from the dispatch, so I can chain Promises as long as I return them.

store.dispatch(
  makeASandwichWithSecretSauce('My wife')
).then(() => {
  console.log('Done!');
});

Вот полный пример того, как вы можете писать создателей действий, которые отправляют действия и асинхронные действия от других создателей действий, и создайте поток управления с помощью Promises.

function makeSandwichesForEverybody() {
  return function (dispatch, getState) {
    if (!getState().sandwiches.isShopOpen) {
      // You don’t have to return Promises, but it’s a handy convention
      // so the caller can always call .then() on async dispatch result.
      return Promise.resolve();
    }

    //Do this action before starting the next one below 
    dispatch(simple_action());

    // We can dispatch both plain object actions and other thunks,
    // which lets us compose the asynchronous actions in a single flow.
    return dispatch(
      makeASandwichWithSecretSauce('My Grandma')
    ).then(() =>
      Promise.all([
        dispatch(makeASandwichWithSecretSauce('Me')),
        dispatch(makeASandwichWithSecretSauce('My wife'))
      ])
    ).then(() =>
      dispatch(makeASandwichWithSecretSauce('Our kids'))
    ).then(() =>
      dispatch(getState().myMoney > 42 ?
        withdrawMoney(42) :
        apologize('Me', 'The Sandwich Shop')
      )
    );
  };
}
//apologize and withdrawMoney are simple action like this for example
      return {
        type:  "END_SUCESS"
      }

//использование

store.dispatch(
  makeSandwichesForEverybody()
).then(() =>
    console.log("Done !");
);

Чтобы создать собственный promises, вы можете использовать библиотеку, такую ​​как bluebird.

//EDIT: Чтобы убедиться, что хранилище полностью обработало это действие, прежде чем что-либо еще произойдет в функции action_creator(), вы можете отправить это simple_action до action_creator();//Я добавил этот комментарий к коду //Do this action before starting the next one below

Ответ 2

dispatch вернет все действия, которые он вызывает, возвращает; поэтому, если вы хотите связать определенные действия (в соответствии с вашим примером), вашему действию нужно будет вернуть Promise.

Как отмечает @Aaleks, если ваше действие было thunk, вы можете создать сценарий, в котором вы вернете Promise, тогда вы можете сделать, как вы упомянули.

BTW Я думаю, что название вашего thunk action_creator немного вводит в заблуждение, так как simple_action на самом деле является создателем Action в языке Redux - отредактировал соответственно:)