2016-09-23 6 views
1

私はreduxサンクを使用していますが、次の問題があります。 uploadClientImageディスパッチは、データベースへのイメージオブジェクトを作成し、イメージIDを返します。Redux Thunkがアクションをディスパッチしないで注文

私はclient_infoを作成する前に2つのイメージIDが必要です。

問題はclientsのアキソスポストが2 uploadClientImageのディスパッチからIDを取得する前に呼び出されています。その2回のディスパッチがAxiosポストリクエストの前に完了するまで待つ方法はありますか?

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

おそらく 'uploadClientImage'は何か非同期を行います。その関数を投稿した場合は、具体的なアドバイスが得られるかもしれませんが、一般的には約束やコールバック関数が必要です。 (もしあなたがAxiosも使っているなら、あなたはすでに約束をしているかもしれません) – azium

+0

@azium他の機能を追加しました。ありがとう! – lost9123193

答えて

1

action.js

あなたが何かを派遣していないので、私はReduxのアクションであることをuploadClientImageニーズを考えていません。それは単に約束を返す通常の関数でなければなりません。私はあなたのコードを(テストせずに)少しリファクタリングしました。

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

こんにちはTim、私はこれを試して、image_idと結果の別のconsole.logを返す前にconsole.log()を追加しました。結果はimage_idの前に出力されます。だから私はまだ奇妙な非同期の問題を抱えていると思う - 私はreduxのアクションを取ることを忘れていた私はこれをもう一度試してみる – lost9123193

+0

私は解決策を試みたと私はエラーが表示されるため、オブジェクト。非同期アクションにはカスタムミドルウェアを使用します。私は関数ディスパッチを追加しないとき – lost9123193

関連する問題