假设async
将按照启动的顺序“解锁”执行是否正确?
以此代码为例:
class Foo {
public fooPromise = new Promise(resolve => setTimeout(resolve, 1000));
public value = null;
public async setValue(v) {
await this.fooPromise;
this.value = v;
}
}
async function main() {
const foo = new Foo();
foo.setValue(1);
foo.setValue(2);
foo.setValue(3);
await foo.fooPromise;
console.log(foo.value);
}
main();
可以假设输出为3
吗?请注意,函数main()
在调用foo.setValue(x)
时不会停止执行,然后等待await foo.fooPromise
中的承诺解析,所以那时我们将有4个等待foo.fooPromise
等待解决。
这段代码只是一个例子,我不会使用这种模式。在我的情况下,我有一个最终初始化的第三方库,我希望我的类的消费者认为它是同步的,他们可以随时调用我的方法,结果将是一致的:所以如果他们设置了一个设置两次,值集将是最后一个
答案 0 :(得分:1)
由于只有一个承诺,而他们都在等同承诺,是的,你可以。因为承诺的注册回调将按照注册顺序执行。
在您的代码中:
foo.setValue(1); // => this will execute first and set value to 1
foo.setValue(2); // => this will execute second and set value to 2
foo.setValue(3); // => this will execute third and set value to 3
await foo.fooPromise; // => this will make the console.log wait for the previous three setValue calls
console.log(foo.value); // => it will always print 3
如果您在setValue
内创建了新承诺,而不是等待相同的承诺,则您无法确定console.log
结果。