const disallowConcurrency = (fn) => {
let inprogressPromise = Promise.resolve();
return async(...args) => {
await inprogressPromise;
inprogressPromise = inprogressPromise.then(() => fn(...args));
};
};
const initCmp = async(arg) => {
return new Promise((res) => {
console.log('executed');
setTimeout(() => res(console.log(arg)), 1000);
});
};
const cmpConcurrentFunction = disallowConcurrency(initCmp);
cmpConcurrentFunction('I am called 1 second later');
cmpConcurrentFunction('I am called 2 seconds later');
这里我创建了一个闭包,其中将一个promise作为传递给内部函数的值。
返回的函数将等待上一次调用完成(在第一次运行中,它是一个已解决的Promise),并将由then
返回的Promise分配给inprogressPromise
。 在这种情况下,then
返回的将是通过initCmp
函数返回的新Promise。 因此,下一次调用该函数时,它将等待上一个完成。至少这是我的理解。 我理解得对吗?
但是,如果我删除await inprogressPromise
,例如像这样:
const disallowConcurrency = (fn) => {
let inprogressPromise = Promise.resolve();
return async (...args) => {
inprogressPromise = inprogressPromise.then(() => fn(...args));
};
};
所以不需要使用await
吗?为什么?
此外,我期望这个能够工作:
const disallowConcurrency = (fn) => {
let inprogressPromise = Promise.resolve();
return async (...args) => {
await inprogressPromise;
inprogressPromise = fn(...args);
};
};
因为我认为首先我要等待之前的承诺完成,然后我才会调用并将返回的承诺分配给inprogressPromise
。
但它不起作用,这两个函数同时被调用。
有人能给我解释一下这里发生了什么吗?
如果你尝试这段代码,你会看到第二次调用。
cmpConcurrentFunction("I am called 2 seconds later")
等待第一个promise完成。
基本上我编写了一个Node包,通过npm在Web应用程序中被导入到浏览器中。 这个Node包库有一个init函数,其中包含一些异步代码,并且可以在代码的不同部分多次调用。 例如,如果第二次调用它,我希望在尝试再次执行代码之前先确保第一次执行完成。
但我的问题是尝试理解为什么该代码有效,如果我使用最新版本则为什么无效。
谢谢!
async
/await
is just syntactic sugar that "hides" aPromise
+.then()
- Andreas