我有一个返回承诺的函数
function ajax() { sideeffect(); return new Promise() }
我在不同的时间调用此函数,我想要的是此函数使调用排队,并且仅在上一个调用解决后运行。
如果我连续ajax
打电话三次,ajax(); ajax(); ajax()
ajax.then(ajax).then(ajax)
,或者如果我打电话四次,它就会相应地链接。
答案 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'));