Зачем использовать, когда это всегда верно? - PullRequest
0 голосов
/ 01 октября 2019

Я вижу большинство примеров в redux-saga с использованием while(true){}:

function* watcherSaga(){
  while (true) {
    yield something()
  }
}

Разве мы не можем просто написать?

function* watcherSaga(){
  yield something()
}

Или есть какая-то разница?

Ответы [ 3 ]

0 голосов
/ 01 октября 2019

Генераторы возвращает Iterator.

Когда вы вызываете next() для итератора, он возвращает возвращаемое значение, а если функция завершается, она генерирует неопределенное значение. значение и будет сделано.

Проверьте приведенный ниже фрагмент. Надеюсь, что это поможет вам.

function* watcherSaga() {
  var i = 0;
  while (true) {
    yield i++;
  }
}

const sagaIterator = watcherSaga();

console.log("**** with while() loop *****");
console.log(sagaIterator.next());
console.log(sagaIterator.next());
console.log(sagaIterator.next());
// You can keep calling sagaIterator.next() and it never gets "done" because of "while(true)"


function* watcherSagaWithoutWhile() {
  var i = 0;
  yield i++;
}

const sagaIteratorWİthoutWhite = watcherSagaWithoutWhile();


console.log("**** withOUT while() loop *****");
console.log(sagaIteratorWİthoutWhite.next());
console.log(sagaIteratorWİthoutWhite.next());
console.log(sagaIteratorWİthoutWhite.next());
// The second call to "next()" will return an "undefined" value and the generator gets done because the generator comes to the end

Для дальнейшего чтения: https://basarat.gitbooks.io/typescript/docs/generators.html

0 голосов
/ 01 октября 2019

Взгляните на следующий пример. Один генератор никогда не «выполняется», а другой генератор выполняется после первого (и единственного) выхода.

function something() {
  return Math.random();
}

function* watcherSaga1() {
  while (true) {
    yield something();
  }
}

function* watcherSaga2() {
  yield something();
}

const watcher1 = watcherSaga1();
const watcher2 = watcherSaga2();

console.log('watcher1: ', watcher1.next());
console.log('watcher1: ', watcher1.next());
console.log('watcher1: ', watcher1.next());

console.log('watcher2: ', watcher2.next());
console.log('watcher2: ', watcher2.next());
console.log('watcher2: ', watcher2.next());
0 голосов
/ 01 октября 2019

С помощью цикла while генератор будет продолжать давать значения вечно. Без этого это только один раз.

Когда вам нужна некоторая последовательность (скажем, кратная 7), такая функция может легко предоставить такую ​​последовательность потребителю, которая накладывает свои собственные ограничения на количество значений. это необходимо.

Генераторы предоставляют чрезвычайно мощный способ структурирования кода и в некоторых случаях позволяют проникать в дизайн. Они особенно полезны в контексте генерации медиа, например p5.js, где много взаимодействующих итераций. Генераторы обеспечивают особенно хороший способ инкапсулировать это.

...