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

2024-02-08

我读过,生成器不会等待承诺。为什么发电机的情况并非如此?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

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

这是一个非常流行的信念,但是生成器本身与 Promise 或异步函数没有关系。生成器只是通过将一些资源和责任委托给上层函数来创建可中断的函数。

的情况下redux-saga,有两部分:独立的saga runner进程和调度器(https://github.com/redux-saga/redux-saga/blob/master/src/internal/runSaga.js https://github.com/redux-saga/redux-saga/blob/master/src/internal/runSaga.js) ,由sagaMiddleware.run()命令,以及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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 ES6 生成器等待 Promise,就像在 redux-saga 中一样? 的相关文章

随机推荐

  • 为什么我的 MKPointAnnotation 不是自定义的?

    我的 MKPointAnnotation 应该使用此代码进行自定义 MKPointAnnotation setAnnotation NSString title atLocation CLLocationCoordinate2D Locat
  • Froala 编辑器:单击 div 时插入插入符号位置

    我正在使用 Froala v2 6 1 当用户单击 div 时 我想在编辑器的最后一个插入符位置准确地插入一个字符串 但该字符串始终插入到编辑器的末尾 这是我所做的事情 div class variable USER ID div Jque
  • Firebase 身份验证不持久

    刷新页面后 身份验证似乎不再持续 即使使用后firebase auth Auth Persistence LOCAL 每当我登录我的应用程序时 它都会成功地将我重定向到仪表板 但是 刷新页面后 无法访问仪表板 这是我的代码 文件名 logi
  • 插入时出现 DbUpdateConcurrencyException

    我正在使用 Entity Framework 6 将数据插入表中以进行集成测试 当我执行以下代码时 我在调用 SaveChanges 时收到 DbUpdateConcurrencyException using var context ne
  • Vue @click.native 不起作用?

    我有这样的导航组件
  • 中accept函数的地址大小长度

    在 sys socket h 中它定义了函数 int accept int socket struct sockaddr address socklen t address len 我的问题与socklen t address len其基于
  • 使用 pyinstaller 运行规范文件时出现错误 22:无效模式('rb')或文件名:' '

    这是我的规格文件 mode python a Analysis final code py pathex C Python27 PyInstaller 2 1 final code hiddenimports hookspath None
  • React-router:通过路由传递数据

    我正在尝试找出通过路线传递数据的最佳方式 我知道我可以使用参数 但某些类型的数据不属于参数 例如 我有一个显示应用程序列表的索引页 每个应用程序旁边都有一个按钮 可将您引导至该应用程序的视图 我想将应用程序本身传递给应用程序处理程序 然而
  • 方法引用如何与具有不同实现函数名称的函数接口兼容?

    这里 对静态方法 isPrime 的引用作为第一个参数传递给 numTest 这是可行的 因为 isPrime 与 IntPredicate 函数接口兼容 因此 表达式 MyIntPredicates isPrime 计算为对对象的引用 其
  • Oracle WITH CLAUSE 不起作用?

    我尝试在查询中使用WITH子句 但不断收到消息 ORA 00942 表或视图不存在 我尝试创建一个简单的查询作为示例 WITH测试AS 从客户中选择 COUNT Customer ID 从测试中选择 但即使这样也不起作用 它只是给出了这样的
  • Spring / Glassfish 3.1.2 过时文件

    我目前正在使用 Spring Web MVC 和 Spring Security 开发一个应用程序 我可以在 Glassfish 3 1 2 上部署它 但是当我想在修复一些错误后重新部署时 我收到此错误 WARNING Exception
  • 如何将用户重定向到 Android 应用程序中的默认启动器?

    自从我尝试弄清楚如何开发一个使用 NFC 身份验证的 Android 解锁屏幕应用程序以来 已经有很长一段时间了 我正在使用 Nexus S 经过在互联网上的多次研究 我得出的结论是 目前不支持将锁屏替换为第三方应用程序 我们需要修改平台才
  • 调用存储过程时,如何在表值参数中包含 RowVerson 列?

    如果我有一个包含 RowVersion 列的 SQLDataRecord 如下面的代码所示 我总是收到 SQL Server 错误 8052 传入的表格数据流 TDS 远程过程调用 RPC 协议流不正确 表值参数 d ls 行 I64d 列
  • 为什么转换函数不能与 std::string 一起使用?

    考虑以下类 其中包含 std string 类型的转换函数 class SomeType public SomeType char value str value operator std string return std string
  • jQuery 循环遍历每个 div

    我很确定这对于 jQuery 高手来说将是一个非常简单的答案 而且我也很确定它涉及某种循环 我试图对两个单独的 div 执行基本相同的计算 但根据找到的图像数量为每个 id 分配不同的 CSS 宽度值 我正在执行的计算实际上与我的问题无关
  • Microsoft Edge浏览器如何读取剪贴板数据

    我无法在 Microsoft Edge 浏览器中读取剪贴板数据 我正在使用下面的 JavaScript if window clipboardData window clipboardData getData IE pastedText w
  • 将类型变量替换为 const 成员

    假设我有一个包含一些常量成员的类 class MyClass public MyClass int a a a MyClass MyClass 0 MyClass const int a 现在我想存储一个实例MyClass某处 例如作为全局
  • 了解 CSS 选择器优先级/特异性

    我想了解 CSS 选择器如何处理属性冲突 如何选择一种财产而不是另一种财产 div background color red div my class background color black div my id background
  • 在Eclipse中一步步调试java程序

    我想逐行调试java程序的整个流程 我正在使用eclipse 我怎样才能做到这一点 在 Eclipse 中调试 Java 程序需要多个步骤 例如 设置断点 启动调试器 控制程序的执行 对于逐行使用 F6 和 F5 进入方法 评估变量等 把所
  • 如何让 ES6 生成器等待 Promise,就像在 redux-saga 中一样?

    我读过 生成器不会等待承诺 为什么发电机的情况并非如此 redux saga 以及如何让我自己的发电机等待 例如 这个传奇 takeLatest FETCH USER REQUESTED function const fetchPromis