gpt4 book ai didi

javascript - 我如何让 ES6 生成器等待 promise ,就像在 redux-saga 中一样?

转载 作者:行者123 更新时间:2023-11-29 23:31:16 25 4
gpt4 key购买 nike

我读到生成器不会等待 promise 。为什么 redux-saga 中的生成器不是这种情况,我如何让我自己的生成器等待?

例如,这个传奇:

takeLatest('FETCH_USER_REQUESTED', function*() {
const fetchPromise = yield put(fetchUser());
const user = yield fetchPromise;
console.log(user)
yield 1
console.log(1)
})

将输出:

Promise
Object // <= user data fetched asynchronously
1

代替:

Promise
undefined
1

最佳答案

How come this is not the case with generators in redux-saga, and how do I make my own generators wait?

这是一个非常流行的信念,但是生成器本身与 Promises 或异步函数无关。生成器只是通过将一些资源和责任委托(delegate)给上层功能来实现可中断功能。

redux-saga 的情况下,有两个部分:独立的 saga runner 进程和调度程序 ( https://github.com/redux-saga/redux-saga/blob/master/src/internal/runSaga.js ),它由 sagaMiddleware.run() 启动命令和 effects react ,将 Action 委托(delegate)给主要的 saga 过程。

因此,模拟 redux-saga 行为的 ES6 中最简单的流程管理器将是这样的(非常简化):

const ProcessManager = (() => {
let context = new WeakMap();
function PM(rootSaga, lastValue) {
if(!context.has(rootSaga)) {
context.set(rootSaga, rootSaga())
}
const iterator = context.get(rootSaga);
const { done, value } = iterator.next(lastValue);
if(done) {
context.delete(rootSaga)
return;
}
if(Promise.resolve(value) === value) {
value.then((asyncValue) => PM(rootSaga, asyncValue))
} else {
PM(rootSaga, value)
}
}
return PM;
})()

const rootSaga = function* () {
yield new Promise(resolve => setTimeout(resolve, 500));
console.log('This will be printed after 500 ms from start');
yield new Promise(resolve => setTimeout(resolve, 500));
console.log('This will be printed after 1000 ms from start');
}

ProcessManager(rootSaga);

关于javascript - 我如何让 ES6 生成器等待 promise ,就像在 redux-saga 中一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47298855/

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