gpt4 book ai didi

javascript - 在普通生成器和 Redux saga 之间产生 promise 的不同行为

转载 作者:行者123 更新时间:2023-11-29 20:46:39 25 4
gpt4 key购买 nike

据我所知,您不能通过 yield 生成器中的 promise 来获得 promise 。而下面的测试证明这是真的。 ret 未定义:

function* foo() {
const ret = yield Promise.resolve(50);
console.log(`ret is ${ret}`);
}

const fooGen = foo();
fooGen.next();
fooGen.next()

但我不明白为什么我可以在 Redux saga 中获得 resolved promise 值。请参阅以下示例(jsfiddle:https://jsfiddle.net/vymgr7de/1/)

// Sagas
function* saga() {
yield call(function*() {
const ret = yield Promise.resolve(50);
yield put({type: "*", payload: `ret is ${ret}`});
});
}

// => ret is 50

Redux saga 玩什么花样?

最佳答案

为了扩展我的评论,这里有一个执行类似操作的代码示例

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)

如您所见,我正在遍历生成器,每当我找到一个 promise 时,我都会等到它被解决,然后将已解决的值传递给 iter.next(value),如果我找到我将其转换为已解决的 Promise,以便 yield 表达式立即解析为它产生的任何内容。

当然,redux-saga 不仅在寻找 promises,还在寻找各种效果,每个效果都有自己定义的功能。

关于javascript - 在普通生成器和 Redux saga 之间产生 promise 的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54231875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com