在OpenUI5 code-base我遇到了这个片段:
// 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));
看起来正在使用native Promise function,没有任何参数传递给它resolve
函数,它带有:
这个承诺要解决的争论。也可以是承诺或者 然后才能解决。
所以,既然看起来承诺会立即解决并调用then
的回调,或许意图是similar to:
var self = this;
setTimeout(function() {
self._updateTableSizes.bind(self, true)
}, 0);
...基本上,释放JavaScript运行时事件循环来完成其他事情(比如渲染)然后回到回调?
我的问题是:
这是一种常见的模式吗?最佳实践?这两种方法都有任何优点/缺点吗?
答案 0 :(得分:8)
是的,sd(training1$IL_1alpha)
[1] 0.4056147
sd(training1$IL_3)
[1] 0.5235212
会立即满足您隐式传入的nsv <- nearZeroVar(training1, saveMetrics = TRUE)
> print(nsv)
freqRatio percentUnique zeroVar nzv
IL_11 1.250000 29.4820717 FALSE FALSE
IL_13 1.052632 6.7729084 FALSE FALSE
IL_16 1.117647 21.9123506 FALSE FALSE
IL_17E 1.238095 16.7330677 FALSE FALSE
IL_1alpha 1.208333 23.1075697 FALSE FALSE
IL_3 1.066667 24.7011952 FALSE FALSE
IL_4 1.315789 19.1235060 FALSE FALSE
IL_5 1.000000 19.5219124 FALSE FALSE
IL_6 1.000000 20.3187251 FALSE FALSE
IL_6_Receptor 1.041667 21.5139442 FALSE FALSE
IL_7 1.611111 18.7250996 FALSE FALSE
IL_8 1.000000 22.3107570 FALSE FALSE
diagnosis 2.637681 0.7968127 FALSE FALSE
值。回调仍然是异步执行的 - 就像您发布的Promise.resolve()
代码段一样。
但是,正如代码中的注释所解释的那样,意图是而不仅仅是以异步方式执行回调:
使用承诺确保在执行超时之前执行。
承诺回调在超时或其他事件之前运行,这些微妙的时序差异有时很重要。鉴于任务循环的选择通常并不重要,不,这不是一个常见的模式;但它是一种有效的模式,可以满足您的需要。
答案 1 :(得分:1)
我注意到这个polyfill中的技术:https://github.com/wicg/inert(带注释)
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);
});