我正在开发Electron,React和Redux的应用程序。在程序启动时,我在渲染过程和主进程之间进行了一些异步ipc调用,并将结果保存在商店中。
if
// in the main app component
componentWillMount() {
const { store } = this.context;
store.dispatch(fetchOptions());
store.dispatch(fetchRequirements());
store.dispatch(fetchStats());
/* miracle function */
},
// actions.js
export function fetchOptions() {
return dispatch => {
dispatch(requestOptions());
ipcRenderer.on('sendOptions', function(event, arg) {
dispatch(receiveOptions(arg));
});
ipcRenderer.send('requestOptions', '');
};
}
// others accordingly
,receiveOptions(arg)
和receiveRequirements(arg)
是动作创建者,最后reducer会将响应保存在商店中。
在receiveStats(arg)
之后,我想发送另一个动作,根据加载到商店的值进行一些计算。但是,通常会在ipc的响应到达之前发送此操作。
我发现this discussion有类似的问题,但他们正在使用store.dispatch(fetchStats())
而不是ipc消息进行api调用,我不知道如何将他们的想法应用到我的问题中。
所以这是我的问题:在继续之前,如何让程序等待所有通道的响应?
编辑:当我在ipc调用之后为调度设置超出0的时间时,它至少可以立即响应,但当响应时间稍长时,它无效。
fetch
答案 0 :(得分:1)
我不熟悉你的icpRenderer
如何运作,或者在调度完成时非常熟悉。我将假设在调用dispatch(receiveOptions(arg))
返回后完成调度
ipcRenderer.on('sendOptions', function(event, arg) {
dispatch(receiveOptions(arg));
});
如果dispatch()
是异步的,则无法正常工作(除非您等到dispatch()
完成后才等待解析承诺)。
你应该能够返回收到一个“承诺”(并解决它),就像这样
// actions.js
export function fetchOptions(promise) {
return dispatch => {
dispatch(requestOptions());
ipcRenderer.on('sendOptions', function(event, arg) {
dispatch(receiveOptions(arg));
if (promise) promise.resolve(); // Resolve the promise
});
ipcRenderer.send('requestOptions', '');
}
}
// return Promises others accordingly
(请注意,您可以在不传递“promise”的情况下调用fetchOptions,因为如果存在promise,我们只调用promise.resolve()。因此,这不应该使您现有的代码复杂化。)
为了等待承诺解决,你可以这样做
// in the main app component
componentWillMount() {
const { store } = this.context;
const promises = [
new Promise((resolve, reject) =>
store.dispatch(fetchOptions({resolve, reject}))),
new Promise((resolve, reject) =>
store.dispatch(fetchRequirements({resolve, reject}))),
new Promise((resolve, reject) =>
store.dispatch(fetchStats({resolve, reject})))
];
Promise.all(promises).then(() =>
// Dispatch another action after the first three dispatches are completed.
);
},
代码并没有超级干净,但希望它至少会起作用。