Javascript Promise.resolve,不传入任何参数

Javascript Promise.resolve,不传入任何参数,javascript,promise,settimeout,sapui5,es6-promise,Javascript,Promise,Settimeout,Sapui5,Es6 Promise,在一次采访中,我遇到了以下片段: // 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)); 看

在一次采访中,我遇到了以下片段:

// 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));
看起来正在使用,没有参数被传递到其函数,该函数采用:

此承诺将解决的争议。也可以是承诺或承诺 他们无法解决

因此,由于promise看起来会立即解析并调用
,然后调用
的回调,因此其目的可能是:

…基本上,释放JavaScript运行时事件循环来完成其他事情(如渲染),然后直接返回回调

我的问题是:

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

是的,
Promise.resolve()
会立即满足您隐式传递的
未定义的值。回调仍然是异步执行的,就像您发布的
setTimeout
代码片段一样

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

使用承诺确保在执行超时之前执行


Promise回调确实在超时或其他事件之前运行,这些细微的时间差异有时很重要。考虑到任务循环的选择通常并不重要,不,这不是一种常见的模式;但它是一种有效的模式,当你需要它时,它会完全满足你的需要。

我注意到了这个polyfill中的技巧:(带注释)


我没有答案,但我认为你的猜测是正确的,使用立即解决的承诺只是一个聪明的用法,可以像你所说的那样立即进行更新而不超时。我不知道这种情况下的最佳实践是什么,但我经常使用
Promise.resolve()。然后(…)
来确保捕获在承诺链中使用的同步代码中抛出的错误,所以我认为这样做不是一个坏的选择。“等到所有内容都呈现出来”-如果这意味着根据浏览器观察样式更改来进行渲染,
Promise.resolve()。那么(…)
是不够的。据我所知,没有办法在渲染后但在下一个任务之前对要运行的函数进行排队。对我来说,这样做的另一个原因是结果是“可以”,因此它为我计划稍后开发的异步函数提供了一个很好的存根,例如,
function codeMeLater(){return Promise.resolve(“总有一天,我会计算它”);}
@danh:Oh,当然
Promise.resolve
通常是一个非常有用的函数,当我说它不常见时,我只是指回调的特定模式。这是否意味着ES6
Promise
API实现了一个微任务机制。据我所知,微任务可能会导致与递归相关的UI被阻塞。@LUH3417:是的,它们确实会阻塞,而且每个功能都必须正确使用它们。
var self = this;
setTimeout(function() {
    self._updateTableSizes.bind(self, true)
}, 0);
const newButton = document.createElement('button');
const inertContainer = document.querySelector('[inert]');
inertContainer.appendChild(newButton);
// Wait for the next microtask to allow mutation observers to react to the DOM change
Promise.resolve().then(() => {
expect(isUnfocusable(newButton)).to.equal(true);
});