我是新來的反應和redux,我面臨一個非常奇怪的問題。我有一個動作如下:ajax在渲染後調用負載
export function getStorySnippetsAction(snippetsLink, channel) {
return dispatch => {
let storiesSnoppet = [];
for (var i = 0; i < snippetsLink.length; i++) {
$.ajax({
url: snippetsLink[i],
dataType: 'json',
cache: false,
success: function (data) {
storiesSnoppet.push(data);
console.log("xxxxxxxxxxxxxxxxxxxxx");
console.log(storiesSnoppet);
}.bind(this)
});
}
dispatch({
type: "SET_STORY_SNIPPET",
payload: {"channel": channel, "storiesSnippet": storiesSnoppet}
});
};
}
正如你可以看到我有一些Ajax調用在一個循環,然後我用dispach設置狀態。現在我的問題是ajax調用是異步的,所以當ajax發送請求時,dispach發生並且不會等待所有ajax調用完成。另外,以下是我所得到的,當我打印出控制檯payload.action:
正如你可以看到,當對象是摺疊它的大小爲0,當我展開我可以看到列表中的一些對象。我對這種奇怪行爲的唯一猜測是異步調用在渲染之後完成,並且自從componentdidmount(我稱之爲getStorySnippetsAction)發生後,再次發生再次發生並且我沒有看到任何結果。有人告訴我應該把getStorySnippetsAction放在componentdidupdate裏面,但是當我這樣做的時候,似乎發生了一個無限循環並且頁面從不加載(我可以看到,在控制檯中,同樣的東西被再次寫入並獲得,這意味着組件做了更新無限調用)。現在我完全卡住了。如果我在componentdDUpUpdate中調用getStorySnippetsAction,我將陷入無限循環,如果我在componentDidMount中調用它,ajax會花費更長的時間,渲染和渲染將與空數組發生,而不是加載ajax結果。
任何人都可以幫忙嗎? (即使是一個想法可能會幫助我解決這個問題。)感謝一百萬)
嘿,我建議你看看終極版-的thunk。 https://github.com/gaearon/redux-thunk –
@MartinMihaylov我認爲OP已經使用了thunk ..否則他們不會用'dispatch'返回一個函數。 – azium
好的,讓我試着理解你的問題。從你的代碼中,它看起來最初storesSnippet被設置爲一個空的數組,所以沒有任何東西會出現在你的屏幕上。這裏的原因就像你說的那樣,ajax調用是異步的。那麼,你想要做的是在完成ajax調用之後調用dispatch,是正確的? –