javascript - Redux-Saga:UI 阻塞,直到 api 调用返回大块 api 请求。我们如何在不阻塞 ui 的情况下实现这一点?
问题描述
function* getTagsAllImages(dataList = []) {
const chunkedList = yield call(chunk, dataList, 5);
for (let list of chunkedList) {
const requests = list.map(item => call(getStoreLableimage, item._id, item.image));
const responses = yield all(requests);
const filtertedReponse = responses.filter(response => (response ? true : false));
const indexes = yield call(getIndexedTagsIds);
yield put(setTagImageSuccess({ image: filtertedReponse, indexes }));
}
}
解决方案
由于yield
将等待所有 api 调用的响应,因此在解决 api 调用之前不会发生进一步的 api 调用requests
。所以,你需要使用flatMap
而不是for
循环。这样一来,所有呼叫都不会被阻止。
function* getTagsAllImages(dataList = []) {
const chunkedList = yield call(chunk, dataList, 5);
const requests = chunkedList.flatMap(list =>
list.map(item => call(getStoreLableimage, item._id, item.image)));
const responses = yield all(requests);
const filtertedReponse = responses.filter(response => (response ? true : false));
const indexes = yield call(getIndexedTagsIds);
yield put(setTagImageSuccess({ image: filtertedReponse, indexes }));
}
参考:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap
推荐阅读
- sql - 即使在 SQL 中遵循 Microsoft 格式后也会出错
- workflow - 在活动中可以进行自我转换
- javascript - 地图循环reactjs中的鼠标悬停
- python - 样本数量不一致的 Python Sklearn 变量
- join - Dataprep 中的自定义联接
- streaming - 互联网电台播放 Spotify 供私人使用
- laravel - Laravel 多对多表
- square - square connect v2 支付表单在 Safari 和 Opera 浏览器中不起作用
- eclipse - ESP32 无法使用 Arduino 插件在 Eclipse 上编程
- python-3.x - 将 vti 文件转换为 numpy 数组