如何使用队列对带有诺言的各种函数调用进行排序

时间:2019-04-26 02:52:47

标签: javascript ajax promise

我有一个返回承诺的函数

function ajax() { sideeffect(); return new Promise() }

我在不同的时间调用此函数,我想要的是此函数使调用排队,并且仅在上一个调用解决后运行。

如果我连续ajax打电话三次,ajax(); ajax(); ajax() ajax.then(ajax).then(ajax),或者如果我打电话四次,它就会相应地链接。

1 个答案:

答案 0 :(得分:2)

创建代表最后创建的Promise的持久变量,在调用ajax时将其链接到其上,将持久变量重新分配给新链,然后返回新链:

let lastProm = Promise.resolve();
function ajax(ms) {
  // sideeffect();
  lastProm = lastProm.then(() => (
    new Promise(resolve => setTimeout(resolve, ms))
  ));
  return lastProm;
}

ajax(1000).then(() => console.log('resolved 1'));
ajax(1000).then(() => console.log('resolved 2'));
ajax(3000).then(() => console.log('resolved 3'));
ajax(1000).then(() => console.log('resolved 4'));