Недавно я начал использовать Python, и эта «функция» сбила меня с толку.
Если я хочу поменять значения двух переменных, в JavaScipt я бы сделал следующее:
var a = 0;
var b = 1;
var temp = a;
a = b;
b = temp;
Мне понадобится третья переменная, чтобы временно удерживать одно из значений. Очень простой обмен не будет работать, потому что обе переменные будут иметь одинаковое значение.
var a = 0;
var b = 1;
a = b; // b = 1 => a = 1
b = a; // a = 1 => b = 1
Представьте, что у вас два разных (красных и синих) ведра и две разные жидкости (вода и масло) в них, соответственно. Теперь попробуйте поменять ведра / жидкости (вода в синем и масло в красном ведре). Вы не можете сделать это, если у вас нет дополнительного ведра.
Python занимается этим с помощью «более чистого» способа / решения: Назначение набора .
a = 0
b = 1
print(a, b) # 0 1
# temp = a
# a = b
# b = temp
a, b = b, a # values are swapped
print(a, b) # 1 0
Я думаю, таким образом Python автоматически создает переменные «temp», и нам не о чем беспокоиться.
takeWhile работает нормально, вам понадобится что-то вроде этого:
const stream = interval(1000)
.pipe(
takeWhile(() => messages.length > 0),
map(() => messages.pop()),
);
Я сделал небольшой пример на stackblitz, надеюсь, вы можете использовать это в своем приложении: https: // stackblitz .com / редактировать / машинопись-sq6wxb? файл = index.ts
Итак, ваша проблема в том, что stream
продолжает излучать даже после того, как messages
пуст.
Вы можете использовать takeWhile
для завершения потока:
const stream = interval(1000).pipe(
map((): Message => messages.pop()),
takeWhile(Boolean),
);
Когда messages
пусто, он возвращает undefined
, то есть false
, когда он превращен в логическое значение, поэтому takeWhile(Boolean)
завершит поток.