Каков наилучший метод для мультизапроса с обратным вызовом или обещанием на node.js? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть ситуация.Я использую Node.js для подключения к специальному оборудованию.давайте предположим, что у меня есть две функции для доступа к аппаратному обеспечению.

hardware.send('command');
hardware.on('responce', callback);

Сначала я создал класс для сопряжения этого с прикладным уровнем следующим образом (я пишу здесь упрощенный код для лучшего понимания)

class AccessHardware {
    constructor() {    
    }
    updateData(callback) {        
        hardware.on('responce', callback);        
        hardware.send('command');
    }
}

Теперь проблема заключается в том, что если существует несколько запросов от уровня приложения к этому уровню доступа, они не должны отправлять несколько «команд» на оборудование.Вместо этого они должны отправить одну команду, и все эти обратные вызовы могут быть обработаны после того, как оборудование ответит на команду.

Поэтому я обновляю код примерно так:

class AccessHardware {
    constructor() {
        this.callbackList = [];
        hardware.on('responce', (value) => {
            while (this.callbackList.length > 0) {
                this.callbackList.pop()(value);
            }
        });        
    }
    updateData(callback) {  
        if (this.callbackList.length == 0) {                    
            hardware.send('command');
        }
        this.callbackList.push(callback);
    }
}

Конечно, япредпочитаю использовать обещание справиться с ситуацией.так что вы предлагаете написать этот код с обещанием?Следующий вопрос: хорош ли этот подход для создания «списка обратных вызовов»?

1 Ответ

0 голосов
/ 24 ноября 2018

Я предпочитаю использовать обещание, чтобы справиться с ситуацией.Так что вы предлагаете написать этот код с обещанием?

В вашем экземпляре будет сохранено обещание, которое будет совместно использоваться всеми вызывающими методами, которые хотят получить одинаковый результат:

class AccessHardware {
    constructor(hardware) {
        this.hardware = hardware;
        this.responsePromise = null;
    }
    updateData() {  
        if (!this.responsePromise) {
            this.responsePromise = new Promise(resolve => {
                this.hardware.on('responce', resolve);
                this.hardware.send('command');
            });
            this.responsePromise.finally(() => {
                this.responsePromise = null; // clear cache as soon as command is done
            });
        }       
        return this.responsePromise;
    }
}

Кстати, если hardwareглобальная переменная, здесь нет смысла использовать class.

Является ли текущее решение хорошим «списком обратных вызовов»?

Да, это такхорошо также и за непредусмотренный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...