Promise.resolve没有传入任何参数

时间:2016-06-22 20:22:49

标签: javascript promise settimeout sapui5 es6-promise

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运行时事件循环来完成其他事情(比如渲染)然后回到回调?

我的问题是:

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

2 个答案:

答案 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);
});