当前位置: 首页 > 知识库问答 >
问题:

如何让ES6生成器等待promise,就像在重制传奇中一样?

梁建德
2023-03-14

我读过发电机不会等待promise。为什么< code>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

共有1个答案

卫高谊
2023-03-14

为什么redux传奇中的发电机不是这样,我如何让自己的发电机等待?

然而,生成器本身与Promises或异步函数没有关系。生成器只是将一些资源和责任委托给上层函数来实现可中断功能。

在< code>redux-saga的情况下,有两个部分:独立的saga runner进程和调度程序(https://github . com/redux-saga/redux-saga/blob/master/src/internal/run saga . js),它由< code > saga middleware . run()命令启动,以及< code>effects反应,它将操作委托给主saga进程。

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

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);
 类似资料:
  • MDN文档 异步/等待函数的目的是简化同步使用promise的行为,并对一组promise执行某些行为。正如promise类似于结构化回调一样,async/await类似于组合生成器和promise。 我了解异步/等待、生成器和promise的基本概念。然而,我不完全理解说async/await类似于将生成器和promise结合起来意味着什么。 所以async/wait简化了生成器和promise

  • 我正在研究ES9中提出的异步生成器,以便能够掌握逻辑。 因为每个产生的值都被用作返回对象中的值属性——由Promise包装——来自下一个()调用: 我认为这对我的promise也是正确的: 因此,这些promise被合并在一起。这听起来并不坏,但我并不认为这是因为: 那么,关键字wait与关键字yield在同一个表达式中使用完全无用,还是我遗漏了一些重要的内容?

  • 我有一个复杂的对象图,我建立在一个Ember控制器。 所以,为了安排这一切,我基本上是想 创建conatainer, 然后,创建细节,其中可能有许多 然后,创建项目,其中会有尽可能多的细节 等待一切promise解决 启动一个自定义的Rest动作来“激活”容器,一旦它有了所有的东西。 代码看起来像这样(咖啡),简化了但我认为要点就在那里 当所有的promise都解决了,一切都是我想要的,然而,al

  • 我正在尝试使用Axon和Saga设计模式在Micorservices之间发送数据,使用Java我有两个服务,一个用于订单,一个用于产品CQRS设计模式完美地工作,我的意思是我将数据发送到axon,我在仪表板中看到它,然后通过查询数据获取并保存在读取数据库(MySQL)中。今天我尝试使用Saga设计模式,当创建新订单时,将保留产品命令发送到axon并通过产品服务获取,但saga没有事件启动,我不知道

  • 我正在努力学习如何正确使用async Wait,但我对它有点共同的想法。 在片段中,我试图构建一个对象数组,其中包含我需要的关于我在组件中上传的文件的信息。问题是this.fileInfo中的对象并没有完全等待返回编码图像的promise,而是在我console.logthis.fileInfo时返回此输出: 如您所见,关键图像是一个值未定义的ZoneAwarePromise。你能帮我修一下吗?

  • 问题内容: 我正在研究Java Selenium-WebDriver。我加了 和 因为我的应用程序需要几秒钟来加载用户界面。所以我设置了2秒的隐式等待。但是我找不到元素文本框 然后我添加 现在工作正常。哪一个是更好的方法? 问题答案: 好吧,有两种类型的等待:显式和隐式等待。显式等待的想法是 隐式等待的概念是 你可以在此处获得细节上的差异。 在这种情况下,我宁愿使用显式等待(尤其是): 函数返回找