javascript等待解决订单

时间:2017-10-26 10:14:52

标签: typescript es6-promise

假设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等待解决。

这段代码只是一个例子,我不会使用这种模式。在我的情况下,我有一个最终初始化的第三方库,我希望我的类的消费者认为它是同步的,他们可以随时调用我的方法,结果将是一致的:所以如果他们设置了一个设置两次,值集将是最后一个

1 个答案:

答案 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结果。