Redux Saga: бросить и остановить генератор - PullRequest
0 голосов
/ 11 октября 2019

Я пишу генератор. Я тестирую это с RITEway . Он проверяет, определено ли window.ethereum. Если его нет, его следует бросить и остановить. По сути, он должен удовлетворять следующим тестам:

describe('handle initialize Web3 saga', async assert => {
  global.window = {}

  assert({
    given: 'nothing, the window object',
    should: 'have no property called Web3',
    actual: window.web3,
    expected: undefined
  })

  const gen = cloneableGenerator(handleInitializeWeb3)()

  {
    // The important parts are in this block scope
    const clone = gen.clone()

    assert({
      given: 'window.ethereum undefined',
      should: 'throw',
      actual: clone.next().value.message,
      expected: '[WARNING]: window.ethereum has no provider!'
    })

    assert({
      given: 'nothing',
      should: 'be done',
      actual: clone.next().done,
      expected: true
    })
  }

  class Provider {}

  window.ethereum = new Provider()

  // ... more tests
})

Вот как я пытался его реализовать.

function* handleInitializeWeb3() {
  if (!window.ethereum) {
    yield new Error('[WARNING]: window.ethereum has no provider!')
  }
  // ... more yields
}

, но эта сага не останавливается. Тест, где он should: 'be done' не пройден, и сага возвращает значения из yield s вне оператора if. Как я могу пройти эти тесты и остановить сагу при появлении ошибки?

1 Ответ

1 голос
/ 13 октября 2019

yield экземпляр ошибки действует так же, как и любое другое значение (т. Е. Генератор продолжает работать). Если вы хотите остановить генератор, вы должны throw new Error(..., как в обычной функции.

Если по какой-то причине вы не хотите throw и действительно хотите выдать экземпляр ошибки, а затем остановитьпросто return; после того, как вы yield исправили ошибку.

...