Как динамически складывать обещания последовательно - PullRequest
1 голос
/ 10 июля 2019

Я пишу электронное приложение. В процессе рендеринга происходит обработка события.

Событие может быть вызвано несколько раз таким образом, что они могут перекрываться. Поэтому необходимо сложить и последовательно обработать экземпляры событий, если они перекрываются.

ipcRenderer.on('doWork', function (event, args) {
   doWork();
});

Поскольку цель состоит в том, чтобы предотвратить перекрытие doWork выполнений, попытались сделать его Обещанием таким образом, чтобы оно выполнялось, и, если поступает больше событий, они накапливаются. Но я не могу построить алгоритм.

Другие вопросы, которые я обнаружил в stackoverflow, всегда касаются заранее определенного / уже известного количества Обещаний (извините, если я что-то пропустил).

Редактировать : вопросы типа:

Как выполнить массив обещаний в последовательном порядке?

Выполнить много обещаний последовательно (Концепция)

Внутри doWork Я называю электрон desktopCapturer.getSources асинхронным. Затем я сохраняю файл в файловую систему и сохраняю максимальное количество снимков экрана, но они используют операции синхронизации Nodejs.

1 Ответ

1 голос
/ 10 июля 2019

Предполагая, что вам удалось заставить doWork() вернуть Обещание, вы могли бы цепочка обещаний, которые возвращает каждый из этих вызовов:

let promise = Promise.resolve();
ipcRenderer.on('doWork', function (event, ...args) {
   promise = promise.then(doWork);
});

Если аргументы должны быть переданыdoWork:

let promise = Promise.resolve();
ipcRenderer.on('doWork', function (event, ...args) {
   promise = promise.then(() => doWork(...args));
});

Однако осознайте, что если скорость событий выше, чем может обработать doWork, ваша цепочка будет становиться все длиннее и длиннее.Если все эти звонки действительно должны быть сделаны, это не проблема.

Но в некоторых сценариях может быть приемлемо и более интересно пропустить вызовы и просто выполнить «последний».Если это вариант, посмотрите на одну из многих реализаций «debounce».В качестве альтернативы, вот идея пропустить вызовы, когда приходит более свежий запрос:

let promise = Promise.resolve();
let pendingArgs = null;
ipcRenderer.on('doWork', function (event, ...args) {
    const isPending = pendingArgs !== null;
    pendingArgs = args; // doWork should be called with the latest version of args
    if (isPending) return; // There is already a pending request to doWork
    promise = promise.then(() => {
        const args = pendingArgs;
        pendingArgs = null;
        return doWork(...args);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...