Асинхронные Стек


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

await stack.push(item);
const item = await stack.pop();

я, в принципе, зарегистрировать слушателей, когда я пытаюсь поп-элемент, над пустой стек и когда я толкаю товар, я проверяю, если есть какие-то ожидания за товар я отправляю его через слушателя.

class AsyncStack {
  constructor() {
    this.stack = [];
    this.waiting_minions = [];
  }

  async push(item) {
    if (this.waiting_minions.length > 0) {
      const signal = this.waiting_minions.pop();
      await signal(item);
    } else {
      this.stack.push(item);
    }
  }

  length() {
    return this.stack.length;
  }

  async pop() {
    return new Promise((resolve) => {
      if (this.stack.length > 0) {
        return resolve(this.stack.pop());
      }
      this.waiting_minions.push(resolve);
    });
  }

}


Комментарии
1 ответ

Вы можете использовать геттер , чтобы вернуть длину.

get length() {
return this.stack.length;
}

Затем вы можете сделать ее такой stack.length вместо этого stack.length().


Для меня было бы больше смысла, чтобы использовать waiting_minions как в очереди, так что ждал самый длинный возвращает значение первого.

const signal = this.waiting_minions.shift();


Возвращаемое значение исполнителем (функция передана обещание) игнорируется. Вам нужно только разрешить (или отклонить) его.

resolve(this.stack.pop());


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

Нет необходимости push() быть async. Вы сразу же поместить значение в стек или передать его обещание ждать, так что вы никогда не ждать ничего. Вам не нужно awaitС разрешения обещание, которое вы уже ждете, когда вас называют await stack.pop()

pop() не нужно быть асинхронным либо. Он должен быть асинхронным, если вы используете ждут внутри его, но если вы называете его ждут.

При использовании awaitесли значение-это не обещание, это преобразует значение для разрешения обещание. Так pop() не надо давать обещания, когда он может принимать значение из стека.

pop() {
if (this.stack.length > 0) {
return this.stack.pop();
}
return new Promise((resolve) => {
this.waiting_minions.push(resolve);
});
}

Есть наверное и другие способы сделать это, но с изменениями, которые я сделал, она по-прежнему работает, как ожидалось.

1
ответ дан 7 марта 2018 в 01:03 Источник Поделиться