2017-02-17 2 views
3

Ich fand die gleiche Frage here, aber ohne eine richtige Antwort, die ich suche.Versprechen in redux-saga

Ich entwickle eine einfache Anwendung mit CRUD-Operationen. Auf der Bearbeitungsseite, nachdem die Komponente (componentDidMount()) montiert wird, löst die App eine Aktion eine bestimmte Stelle Details abzurufen:

dispatch({ type: FETCH_POST, id: 'post-id' }) 

Ich verwende redux-Saga und wollen das oben Anruf ein Versprechen zurückzukehren damit ich auf die API-Antwort zugreifen kann.

Jetzt, ohne ein Callback/Promise, habe ich am Ende einen neuen Zustand im Speicher definiert (wie post_edited) und verbinden/map es mit Requisiten in der Komponente für die Bearbeitungsseite.

Was wäre der beste Weg, um mit dieser Art von Situation umzugehen?

Antwort

6

Könnten Sie bitte weitere Informationen zu Ihrem Problem bereitstellen? Ich bin mir nicht sicher, ob ich richtig das Problem zu verstehen, aber die gängige Praxis ist:

api.js

function apiCallToFetchPost(id) { 
    return Promise.resolve({name: 'Test}); 
} 

postSaga.js

function* fetchPostSaga({id}) { 
    try { 
    const request = yield call(apiCallToFetchPost, id); 
    // -> in post reducer we will save the fetched data for showing them later 
    yield put({type: FETCH_POST_SUCCESS, payload: request}); 
    } catch (error) { 
    yield put({type: FETCH_POST_SUCCESS_FAILURE, error}) 
    } 
} 

export function* onBootstrap() { 
    yield takeLatest(FETCH_POST, fetchPostSaga); 
} 
+0

Es gibt bereits eine Zustandsgröße auf die halten Liste der "Posten". Dann müssen wir zwei Zustände haben, einen für die Liste "Beiträge", und den anderen für eine einzelne Ressource, um 'Beitrag' zu bearbeiten/anzuzeigen? Ist das die gängige/beste Praxis? Eigentlich wollte ich keinen weiteren Zustand für einen einzelnen "Beitrag" hinzufügen. –

+0

Dieser Code hat nichts mit dem Status zu tun, sondern bewirkt nur, dass Aktionen ausgelöst werden. Ihr Reducer-Code entscheidet, was mit den abgerufenen Daten geschehen soll. hier gibt es keinen Reducer-Code. Wenn Sie bereits über anderen Code verfügen, der die gesamte Liste der Posts abruft, brauchen Sie nichts davon. Sie können einfach eine Auswahlfunktion in Ihrem Reduzierer erstellen (wie 'getPostById (state, id)') und sie in 'mapStateToProps()' aufrufen. – stone