Решение асинхронной проблемы производитель-потребитель в JS - PullRequest
0 голосов
/ 27 июня 2019

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

Моя непосредственная мысль, чтобы решить эту проблему, состоит в том, чтобы использовать некоторый объект очереди, который имеет ожидаемый сдвиг / получение, очень похоже на эту асинхронную очередь в стандарте Python

Однако я искал и не смог найти библиотек JS, которые имеют этот тип структуры данных для меня.Я бы подумал, что это будет общий шаблон.

Каков общий шаблон для решения этой проблемы в JS, и есть ли библиотеки, которые могут помочь?

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Если производитель данных просто самопроизвольно производит данные, а потребитель просто хочет знать, когда появятся какие-то новые данные, то это звучит так, будто потребитель должен просто подписаться на событие, которое будет срабатывать каждый раз, когда появляются новые данные. Вы можете просто использовать объект EventEmitter в node.js, чтобы создать эмиттер, который потребитель может прослушивать, а производитель будет запускать и генерировать события всякий раз, когда появляются новые данные. Для реализации этого не требуется никакой внешней библиотеки, поскольку встроенный объект EventEmitter имеет все инструменты, необходимые для регистрации уведомлений и запуска уведомлений.

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

С небольшим описанием, которое вы предоставили, я не вижу особой необходимости в сложной системе очередей. Это просто звучит как публикация / подписка или простая система уведомлений о событиях. Если проблема более сложная, пожалуйста, дайте нам более подробную информацию о производителе данных, чтобы мы могли лучше сопоставить инструменты, доступные в node.js, с потребностями вашей конкретной проблемы.

0 голосов
/ 27 июня 2019

В случае небольшой простой программы я просто написал бы что-то вроде этого.

var data = [];

function Consumer()
{
    this.isConsuming = false;

    this.notify = function(){
        if(this.isConsuming)
        {
            return;
        }
        this.consumeNext();
    }

    this.consumeNext = async function(){
        this.isConsuming = true;
        if(data.length > 0)
        {
            //consume one datum
            console.log(await this.consume(data.shift()));

            //consume next datum
            this.consumeNext();
        }
        else
        {
            this.isConsuming = false;
        }
    }

    this.consume = async function(datum){
        return datum * datum;
    }
}



var consumer = new Consumer();
//call consumer.notify() when your producer produces
data.push(1,2,3,4,5);
consumer.notify();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...