Чтобы расширить мой комментарий, приведу пример кода, который делает нечто подобное
function * test() {
const result = yield new Promise(resolve => setTimeout(() => resolve('foo'), 1000))
console.log('Result is: ', result)
}
function run(gen) {
const iter = gen()
const makeStep = (err, value) => {
const step = !err ? iter.next(value) : iter.throw(err)
if (step.done) return
const p = step.value instanceof Promise ? step.value : Promise.resolve(step.value)
p.then(val => makeStep(null, val), err => makeStep(err))
}
makeStep()
}
run(test)
Как видите, я перебираю генератор, и всякий раз, когда я нахожу обещание, я жду, пока оно не будет разрешено, и затем передаю разрешенное значение в iter.next(value)
. Если я найду что-то еще, я преобразую его в разрешенное обещание, чтобы Выражение yield мгновенно превращается во все, что было получено.
Конечно, Redux-Saga ищет не только обещания, но и всевозможные эффекты, каждый из которых имеет свою определенную функциональность.