首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Saga中异步地加入一组承诺?

如何在Saga中异步地加入一组承诺?
EN

Stack Overflow用户
提问于 2018-08-15 13:17:35
回答 2查看 5.3K关注 0票数 5

在一个redux传奇中,我向不同的系统发送了六个获取请求。我想等到所有这些请求返回,然后对结果做一些最后的处理。

为此,我有一个promises数组,表示每个查询。我可以在数组上调用Promise.all(),但这将导致传奇挂起,从而导致所有事件挂起,直到承诺返回。

我尝试创建一个名为async promisepromise.all,然后对这个承诺使用redux-effects调用,但这也是挂起的。

在等待承诺回归的同时,我怎样才能保持我的传奇故事的async性质?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-15 16:50:53

要并行运行所有请求,您应该使用来自redux-sagaall效果。它类似于您已经引用的Promise.all方法。

示例:

代码语言:javascript
运行
复制
import { fetchCustomers, fetchProducts } from './path/to/api'
import { all, call } from `redux-saga/effects`

function* mySaga() {
  const { customers, products } = yield all({
    customers: call(fetchCustomers),
    products: call(fetchProducts)
  });
  // do something with results
}

这是在并行中运行异步操作并等待所有进程完成的最直接的方式。这种方法将而不是阻塞javascript事件循环。它只会阻止生成器函数的其余部分运行。其他sagas中的其他操作和其他事件(如单击)仍将由应用程序在请求执行时接收。

有关更多信息,请参考官方文档

票数 11
EN

Stack Overflow用户

发布于 2018-08-15 13:25:19

你可以做这样的事

代码语言:javascript
运行
复制
*getProductsSaga() {
    while (true) {
      yield take(types.GET_PRODUCTS_REQUEST);
      try {
        const result1 = yield call(() => getProducts1Promise());
        const result2 = yield call(() => getProducts2Promise());
        const result3 = yield call(() => getProducts3Promise());
        const result4 = yield call(() => getProducts4Promise());
        yield put({
          type: types.GET_PRODUCTS_SUCCESS,
          payload: [result1, result2, result3, result4] // process/combine results depending on how you want
        });
      } catch (error) {
        yield put({
          type: types.GET_PRODUCTS_FAILURE,
          payload: error
        });
      }
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51859486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档