【发布时间】:2015-07-27 23:06:28
【问题描述】:
我正在审查 ES6 中的 Promise 实现,并且想知道以下示例中的行为。在此示例中,我没有立即使用 then() 方法注册处理程序。这样做(在 Chrome 43 中)会在 promise 被拒绝时在控制台中记录一个错误,但处理程序仍在执行。
我的假设是我收到错误是因为在我附加处理程序之前承诺被拒绝(由于 setTimeout)。但是按照这种逻辑,当确定要解决承诺时,Chrome 不应该也记录一个错误吗?这是怎么回事?
var par = document.querySelector('p');
var P = new Promise(function(resolve, reject){
var v = Math.random();
if(v < 0.5){resolve(v)}
else{reject(v)}
});
//wait to attach handlers
setTimeout(function(){
var n = P.then(
function(v){
par.innerHTML = "Good, "+v+" is less than 0.5.";
},
function(v){
par.innerHTML = "Uh oh, "+v+" is greater than or equal to 0.5.";
}
)
},1000);
<p></p>
【问题讨论】:
-
Chrome 的“本机”承诺行为不正确
-
“当确定要解决承诺时,Chrome不应该也抛出错误吗?”是什么意思?
-
@JaromandaX 关心扩展吗?虽然这种行为不在规范中,但它很常见,我不确定我是否会将其归类为“不正确”。
-
@loganfsmyth - 我曾经使用过(至少声称)符合 Promise/A+ 规范的每个 Promise 库都不需要立即使用 .catch() 来避免未捕获的异常,如果承诺在调用任何 then 方法之前被拒绝。事实上,在那之前的解决办法很好,在这方面拒绝应该没有区别
-
没有什么不正常的。这是预期行为,目前正在标准化。
标签: javascript promise ecmascript-6