2016-09-23 4 views
1

Ich benutze Redux Thunk und ich habe das folgende Problem. Der Versand uploadClientImage erstellt ein Image-Objekt für die Datenbank und gibt die Image-ID zurück.Redux Thunk nicht Dispatching Aktionen in Reihenfolge

Ich brauche die 2 Image-IDs, bevor ich client_info erstelle.

Das Problem ist die axios Post clients aufgerufen wird, bevor ich die IDs von den 2 uploadClientImage dispatches.Is es eine Möglichkeit, zu warten, bis diese zwei Depeschen vor der axios Post-Anforderung fertig sind abzurufen genannt wird?

action.js

export function uploadClientImage(image_file) { 
    return function(dispatch) { 
    var formData = new FormData(); 
    for (var key in image_file) { 
     formData.append(key, image_file[key]); 
    } 
    console.log(formData); 
    axios.post(`${API_URL}/photos`, formData, {withCredentials: true, headers: {'Content-Type': 'multipart/form-data'}}) 
     .then(response => { 
     var image_id = response.data.id; 
     return image_id; 
      }) 
    .catch(() => { 
     console.log("Can't fileUpload"); 
     }); 
    } 
} 

export function createClient(client_info, logo, photo) { 
    return function(dispatch) { 
    var logo = client_info.logo_id[0]; 
    var logo_id= dispatch(uploadClientImage(logo); 

    var photo = client_info.photo_id[0]; 
    var photo_id = dispatch(uploadClientImage(photo)); 

    client_info["photo_id"] = photo_id; 
    client_info["logo_id"] = logo_id; 

    axios.post(`${API_URL}/clients`, client_info, {withCredentials: true}) 
    .then(response => { 

     //...... 
    }) 
    .catch(() => { 
     console.log("Can't create client"); 
    }); 
    } 
} 
+0

Wahrscheinlich 'uploadClientImage' tut etwas asynchron. Wenn Sie diese Funktion posten, können wir Ihnen wahrscheinlich spezifische Ratschläge geben, aber im Allgemeinen benötigen Sie eine Versprechens- oder Rückruffunktion. (Sie können bereits ein Versprechen haben, wenn Sie auch Axios verwenden) – azium

+0

@azium Ich fügte die andere Funktion hinzu. Vielen Dank! – lost9123193

Antwort

1

Ich glaube nicht, uploadClientImage braucht eine Redux Aktion zu sein, da du nichts Dispatching. Es sollte nur eine reguläre Funktion sein, die ein Versprechen zurückgibt. Ich habe deinen Code ein wenig überarbeitet (ohne ihn zu testen).

export function uploadClientImage(image_file) { 
    var formData = new FormData(); 
    for (var key in image_file) { 
     formData.append(key, image_file[key]); 
    } 
    console.log(formData); 
    // return the promise axios creates 
    return axios.post(`${API_URL}/photos`, formData, {withCredentials: true, headers: {'Content-Type': 'multipart/form-data'}}) 
     .then(response => { 
     var image_id = response.data.id; 
     return image_id; 
      }) 
    .catch(() => { 
     console.log("Can't fileUpload"); 
     }); 
} 

export function createClient(client_info, logo, photo) { 
    return function(dispatch) { 
    var logo = client_info.logo_id[0]; 
    var photo = client_info.photo_id[0]; 
    // upload both images at the same time, continue when both are done 
    Promise.all([uploadClientImage(logo), uploadClientImage(photo)]) 
    .then(function(results){ 
     client_info["photo_id"] = results[0]; 
     client_info["logo_id"] = results[1]; 

     return axios.post(`${API_URL}/clients`, client_info, {withCredentials: true}) 
    }) 
    .then(response => { 

     //...... 
    }) 
    .catch(() => { 
     console.log("Can't create client"); 
    }); 
    } 
} 
+0

Hallo Tim, ich habe es versucht und ich habe eine console.log() hinzugefügt, bevor ich die image_id und eine weitere console.log der Ergebnisse zurückgegeben habe. Die Ergebnisse werden vor der image_id ausgedruckt. Ich denke, ich habe immer noch ein merkwürdiges Async-Problem -EDIT Ich habe vergessen, die Redux-Aktion zu nehmen Ich werde es nochmal versuchen – lost9123193

+0

Ich habe die Lösung versucht und ich denke, die Aktion ist notwendig, weil ich den Fehler bekomme Aktionen müssen klar sein Objekte. Verwenden Sie benutzerdefinierte Middleware für asynchrone Aktionen. wenn ich den Funktionsversand nicht hinzufüge – lost9123193

Verwandte Themen