Javascript 我如何让ES6生成器等待承诺,就像在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

我已经读到发电机不会等待承诺。为什么《redux传奇》中的生成器不是这样,我如何让自己的生成器等待

例如,这个传奇故事:

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);