在继续使用electron / redux之前等待多个ipc调用完成

时间:2016-03-14 11:10:41

标签: javascript reactjs ipc redux electron

我正在开发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

1 个答案:

答案 0 :(得分:1)

使用Promises

的示例

假设

我不熟悉你的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.
        );
    },

代码并没有超级干净,但希望它至少会起作用。