Javascript 我如何让ES6生成器等待承诺,就像在redux传奇中一样?
我已经读到发电机不会等待承诺。为什么《redux传奇》中的生成器不是这样,我如何让自己的生成器等待 例如,这个传奇故事:Javascript 我如何让ES6生成器等待承诺,就像在redux传奇中一样?,javascript,es6-promise,redux-saga,Javascript,Es6 Promise,Redux Saga,我已经读到发电机不会等待承诺。为什么《redux传奇》中的生成器不是这样,我如何让自己的生成器等待 例如,这个传奇故事: takeLatest('FETCH\u USER\u REQUESTED',函数*(){ const fetchPromise=yield put(fetchUser()); const user=收益率; console.log(用户) 收益率1 控制台日志(1) }) 将输出: Promise Object // <= user data fetched asyn
takeLatest('FETCH\u USER\u REQUESTED',函数*(){
const fetchPromise=yield put(fetchUser());
const user=收益率;
console.log(用户)
收益率1
控制台日志(1)
})
将输出:
Promise
Object // <= user data fetched asynchronously
1
为什么redux传奇中的发电机不是这样,我如何让自己的发电机等待
然而,这种非常流行的观点认为,生成器本身与承诺或异步函数无关。生成器只是将一些资源和责任委托给上层功能,以实现可中断功能
对于redux saga
,有两个部分:独立的saga运行程序进程和调度程序(),由sagaMiddleware.run()
命令启动;以及effects
反应,将动作委托给主saga进程
因此,ES6中最简单的流程管理器(它模拟了redux saga
行为)将如下所示(非常简化):
关键字是否会产生
关键字并等待返回值?你能告诉我你在哪里读到的吗?我在这里读到:我错了。这是一个很好的解释。
Promise
undefined
1
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);