yield []和yield all()之间的区别 - ES6/redux-saga

16

使用redux-saga的yield all([])ES6内置的yield []相比是否有任何优势?

为了并行运行多个操作,redux-saga建议使用:

const result = yield all([
  call(fetchData),
  put(FETCH_DATA_STARTED),
]);

但是不使用 all() 方法同样可以实现相同的效果:

const result = yield [
  call(fetchData),
  put(FETCH_DATA_STARTED),
];

哪一个更好,为什么?


根据文档的说明,基本上与Promise.all([...])Promise.resolve([...])之间的区别相同。 - Thomas
他们正在做同样的事情 - 产生任务并等待它们全部完成。顺便说一句,生成数组不是ES6的特定功能,而是redux-saga的一个功能。 - pumbo
事实上,这两者都不是 ES6 的一部分。如果你正在使用生成器函数,redux-saga 处理所有的值。 - Bergi
1个回答

22

就像Mateusz Burzyński (redux-saga维护者)在这里所解释的那样,它们没有功能上的区别:

从底层来看,它们是相同的,但yield [...effects]将导致一个弃用警告并通知您使用all

这是为了使并行行为更加明确,并很好地呈现了Promise.all

最好使用all(),因为它告诉读者我们在这里产生了多个effect,但是不使用它也可以实现各种yield的效果:

yielding an object with multiple effects

const { company, profile } = yield {
  company: select(getCompany),
  profile: select(getUserProfile, userId),
};

生成一个数组字面量

yield [
  put(userRequestSucceeded(userId)),
  put(userReceived(response.data)),
];

使用 map 方法返回数组

yield userIds.map(userId => call(fetchUserDetails, userId));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接