js实现方法(异步)调用多次顺序执行?

作者站长头像
站长
· 阅读数 15
const updateNode = async (node: TCartType) => {
  const res = await postUpdateNode({
    id,
    name,
    type: 'NODE',
    data: node,
    version: store.version + 1,
  })
  store.version = res.data.version
}

这个方法会被多次调用,就会发出多个请求,这时候就不能保证哪个先成功了,但是必须要顺序执行,请问怎么能做到按照调用的顺序执行成功后再执行下一个,如果这个时候又进来,放到队列最后,类似先进先出执行完成

回复
1个回答
avatar
test
2024-07-18

你看,你都提到了“队列”,所以解决这个问题就是用队列啊。基本思路就是,

  1. 调用的时候,封装一个行为(函数),放入队列
  2. 触发对队列进行处理

而处理的时候,会依次 await 调用队列中封装的每一次行为,直到处理完。考虑到有可能在处理过程中被触发,所以要加一个标志来判断是否在处理中,如果已经在处理中,就不管了,否则启动处理过程。

示意代码(仅示例,没测试)

const updateNode = (() => {
    const queue = [];
    let running = false;

    function async run() {
        if (running) { return; }
        running = true;
        while (queue.length) {
            await queue.shift()();
        }
        running = false;
    }

    return (node: TCartType) => {
        queue.push(async () => {
            const res = postUpdateNode({});
            store.version = res.data.version;
        });
        run();
    }
})();
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容