以下React组件是一种允许用户同时更新数百条记录的形式。为了维持服务器的可伸缩性,我决定遵循本文中的建议pLimit库,以限制命中服务器的并发请求数:What is the best way to limit concurrency when using ES6's Promise.all()?。
但是,我无法解决这两个错误:
我尝试使用useMutation挂钩为每个记录调用变异。问题是我无法在pLimit Promise包装器的函数中使用useMutation钩子,除非该函数是组件。但是我不能让函数成为组件,否则会遇到上面的第二个错误。
所以我一直在努力寻找解决方案。
import pLimit from 'p-limit'
function updateIndividual(x) {
let [update, {called, loading, error}] = useMutation(UpdateMutation, {
client: client,
variables: {...},
});
update()
let label = x.name + " ";
label += loading ? "updating..." : error ? `error... ${error}` : called ? "updated" : "start";
return label
}
export default function Form(props) {
const [rows, setRows] = useState(props.data.reduce(function(map, val) {
map[val] = undefined; // { 'one': undefined, 'two': undefined...}
return map;
}, {}));
const limit = pLimit(3);
const promises = data?.map(x => {
return limit(() => updateIndividual(x));
});
(async () => {
setRows(await Promise.all(promises));
})();
return <div id='update-rows'>
{rows.map((k, v) => (
<div id={k}>{rows}</div>
))}
</div>
}