Promise.resolve没有传入任何参数

Jon*_*ink 10 javascript settimeout promise sapui5 es6-promise

OpenUI5代码库中,我遇到了这个代码段:

// Wait until everything is rendered (parent height!) before reading/updating sizes.
// Use a promise to make sure
// to be executed before timeouts may be executed.
Promise.resolve().then(this._updateTableSizes.bind(this, true));
Run Code Online (Sandbox Code Playgroud)

看起来正在使用本机Promise函数,没有参数传递给它的resolve函数,它接受:

这个承诺要解决的争论.也可以是Promise或者是一个可以解决的问题.

所以,既然看起来承诺会立即解决并调用then回调,也许意图类似于:

var self = this;
setTimeout(function() {
    self._updateTableSizes.bind(self, true)
}, 0);
Run Code Online (Sandbox Code Playgroud)

...基本上,释放JavaScript运行时事件循环来完成其他事情(比如渲染)然后回到回调?

我的问题是:

这是一种常见的模式吗?最佳实践?两种方法都有任何优点/缺点吗?

Ber*_*rgi 10

是的,Promise.resolve()会立即使用undefined您隐式传入的值来实现.回调仍然是异步执行的 - 就像setTimeout您发布的代码段一样.

但是,正如代码中的注释所解释的那样,意图不仅仅是异步执行回调:

使用promise以确保在执行超时之前执行.

承诺回调确实在超时或其他事件之前运行,这些微妙的时序差异有时很重要.鉴于任务循环的选择通常并不重要,不,这不是一个常见的模式; 但它是一种有效的模式,可以在您需要时完全满足您的需求.