对于我正在处理的应用,我们在Redux商店中使用服务器端React呈现,我们需要与我们的API进行通信。这一切都很好,但对于某些视图,我需要之前的数据我将它呈现给浏览器。我在渲染之前使用react-fetcher来执行函数,并且使用静态测试数据,这非常合适。但是,只要我想使用API中的数据,我就会迷失方向。一切都是异步的,但这意味着我的应用程序在我从API返回结果之前呈现。
我的代码如下所示:
function getData(apiToken, dispatch) {
superagent.get('http://api.url/endpoint')
.set('x-api-token', apiToken)
.end((err, res) => {
dispatch({
type: 'MY_STORE_ACTION',
data: res.body
});
});
}
@prefetch(({ dispatch, apiToken }) => getData(apiToken, dispatch))
当然,这不会起作用,因为end
是异步回调而我的应用程序并不等待它。
可能值得一提的是,我对ECMAScript和NodeJS(来自PHP)的世界都很陌生,所以也许我的思维方式完全错误; - )
答案 0 :(得分:0)
根据react-fetcher
文档,您应该使用getData
函数调用调度。
我会尝试以下方法:
function getData(apiToken) {
// prefetch expects you to return a promise
return superagent.get('http://api.url/endpoint')
.set('x-api-token', apiToken)
.end((err, res) => {
return {
type: 'MY_STORE_ACTION',
data: res.body
};
});
}
@prefetch(({ dispatch, apiToken }) => dispatch(getData(apiToken))
并确保如上所述返回您的承诺。根据文件:
@prefetch
装饰器用于通用数据,而@defer
用于仅在客户端上需要的数据。他们每个人都接受返回承诺的功能。