2016-10-01 4 views
1

У меня есть взаимодействие с флажком, который должен запускать HTTP-запрос каждый раз при щелчке по галочке.Порядок управления вызовами ajax с помощью redux-saga

Я хотел бы, чтобы каждый вызов запускался после завершения предыдущего вызова.

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

Если я использую call, ничего запрос, пришедший в не будет игнорироваться, пока

Если я использую fork, звонки будут все идут в то же самое время. Мне непонятно, если/как дождаться завершения задачи. Будет ли yield task сделать это?

Я вижу, что каналы могут «буферизовать» запросы, но мне непонятно, как использовать каналы таким образом.

+0

кажется, что 1-й пример из [канала] документ (https://yelouafi.github.io/redux-saga/docs/advanced/Channels.html) должны делать именно чего вы хотите достичь. Можете ли вы, возможно, уточнить, какая часть использования канала вам не понятна? – MadNat

+0

Что делать, если для каждого объекта нужен другой «actionChannel». Это было бы нормально, если бы запросы, параллельные для разных объектов, но должны быть синхронными для любого конкретного объекта. – blockhead

+0

Вы хотите, чтобы все взаимодействия вызывали HTTP-запросы? или вы хотите взять последнее, как только предыдущий вызов будет выполнен? вы правы, что вам следует использовать каналы для этого. , чтобы ответить на ваш следующий вопрос: вы могли бы просто иметь ключи сопоставления объектов (соответствующие объектам) каналам. это было бы немного сложно, так как каждый раз, когда вы видите новый ключ, вы хотите создать новую сагу. – WuTheFWasThat

ответ

1

Используйте takeLatest помощник.

function* runRequest(action) { 
    const status = action.payload; 
    yield call(api, status ? 'on' : 'off'); 
} 

function* rootSaga() { 
    yield* takeLatest(CHECKBOX_CHANGED, runRequest); 
} 

takeLatest помощник полезно, если вы хотите, чтобы начать запрос HTTP через определенное действие отправляется и предыдущий запрос отменяется до того, как новый один начал.

Вот официальная документация: http://yelouafi.github.io/redux-saga/docs/basics/UsingSagaHelpers.html

+0

Я не хочу, чтобы предыдущий был отменен. Я хочу, чтобы все они побежали, в порядке. – blockhead

+0

Умм ... когда вы отправляете запрос A, B, C в этом порядке, вы хотите получать ответы в том же порядке, что и запросы, даже если вы получили ответ B сначала, правильно? – kuy

+0

Я не особенно забочусь о ответах, но мне нужно, чтобы B начинался только после окончания A, и для C. – blockhead