2016-12-22 83 views
1

我有一个称为initialiseApp的操作,显然它会初始化应用程序。我需要从服务器中获取一些信息,例如用户信息,样式和正在显示的页面的一些细节(它是单页应用程序)。我正在使用redux-sagas,我无法弄清楚链接异步操作的方式,以便它们按顺序发生,而不是并行。使用redux-sagas链接异步操作

我需要在调用用户信息之前请求任何样式信息,因为在服务器端,用户的调用会去并检索用户并在会话中设置一些东西。因为这些样式目前并行请求,所以它显示错误,因为用户尚未在服务器上设置。

所以我用put.sync尝试,但似乎并没有工作,但这里是我到目前为止的代码(我还使用打字稿的方式):

private *invokeAndWaitOn(action: IAction<any>) { 
    const putSync = (put as any).sync; // The typings file for redux-sagas does not yet include put.sync 
    yield putSync(action);  
} 

private *invokeArrayOfActions(actions: IAction<any>[]) { 
    for (let action of actions) { 
     yield* this.invokeAndWaitOn(action); 
    } 
} 

但这似乎没有工作,我找不到任何如何正确使用redux-saga的put.sync效果的例子。

任何人都可以看到我做错了什么,或者有没有更好/正确的方法来做到这一点?

在此先感谢。

回答

1

我们假设,为了这个用例,你有两个动作fetchUserfetchStyle。您想在第一个动作成功之后右击第二个动作

在这种情况下,你需要有其他的两个动作每个处理成功错误,使自己的行为是如下:

对于用户取:fetchUserfetchUserSuccessfetchUserError

对于风格取:fetchStylefetchStyleSuccessfetchStyleError

然后换你的整个过程中取的,比方说sagaFunction如下:

private* fetchUserSaga() { 
    try { 
    yield put(fetchUser()); 
    let response = yield call(/* fetchUser API function */]) 
    yield put(fetchUserSuccess(response)); 
    } catch (err) { 
    yield put(fetchUserFailure(err)); 
    } 
} 

提示:你必须使用从redux-sagacall效果。

private* fetchStyleSaga() { 
    try { 
    yield put(fetchStyle()); 
    let response = yield call(/* fetchStyle API function */]) 
    yield put(fetchStyleSuccess(response)); 
    } catch (err) { 
    yield put(fetchStyleFailure(err)); 
    } 
} 

然后通过这些传奇故事功能,您调用发电机的功能,如下图:

/* 
const sagas = [ 
    fetchUserSaga, 
    fetchStyleSaga, 
]; */ 

private* invokeArrayOfSagas(sagas: ISaga<any>[]) { 
    for (let saga of sagas) { 
    yield call(saga()); /* saga: fetchUserSaga || fetchStyleSaga */ 
    } 
} 

这将等到fetchUserSaga完毕再开始fetchStyleSaga

更多信息:如果你想组的一些行动,并呼吁他们在平行的动作另一一堆依赖于它们,你可以得到他们的阵列与一个yield关键字,看到更多的here

+0

感谢您的回复,这是非常全面的,事实上回答了这个问题。然而,我忽略说(完全是我的错),我没有直接访问这个传奇故事的自己(就像我实现它的方式),我只能访问这些行为。我可以称之为行动,但不是实际的传奇故事。我可以重新编写它来直接访问这个传奇故事,但是如果有一种方法可以使用put或put.sync,那么需要进行大量的返工,这对我目前的情况会更好一些? – Anupheaus

+0

呃,实际上,只要你在放置一个发生器之前把关键字'yield'放到发生器中,所以它已经是同步的了。无论哪种方式,你都需要另一个操作来处​​理成功,这样你就可以在你的情况下聆听成功。 –