Joy*_*abu 6 javascript es6-promise
如果多次拒绝/解决ES6承诺,标准行为是什么?
以下代码只解析一次Google Chrome,这是所有浏览器中的标准行为吗?
new Promise(function(e) {
$('#button').click(function(){
resolve();
});
});
Run Code Online (Sandbox Code Playgroud)
我已经看到了一个承诺polyfill在试图解决已经解决的承诺时抛出异常.es6-promise的规范是否指定了这个,或者不符合polyfill标准吗?
更新
对不起,我刚才意识到它不是一个polyfill,而只是一个Promise(非标准)的最小实现.
T.J*_*der 10
承诺无法解决多次.一旦承诺得到解决(解决或拒绝),将再次调用解决(解决或拒绝)协议.没有错误提出.
我已经看到了一个承诺polyfill在试图解决已经解决的承诺时抛出异常.es6-promise的规范是否指定了这个......?
不,不是的.Promise Resolve Functions中包含了这一点,它说明了它们的作用.以下是前四个步骤:
当使用参数解析调用promise resolve函数F时,将执行以下步骤:
- 断言:F有一个[[Promise]]内部插槽,其值为Object.
- 让承诺成为F [[Promise]]内部插槽的价值.
- 设hasResolved是F [[AlreadyResolved]]内部插槽的值.
- 如果已解析.[[Value]]为true,则返回undefined.
- ...
(我的重点)
有人认为,试图解决既定的承诺应该是一个错误.由于这不符合ES2015的规范,因此可能很难添加它,即使他们能够找到TC-39冠军来提出这样做.它可能最终必须是一个标志或Promise子类,Promise如果这是你想要的行为,可以很容易地添加一个自己的子类.
承诺对象
Promise是一个对象,用作延迟(可能还异步)计算的最终结果的占位符。
任何Promise对象都处于以下三种互斥状态之一:已实现,已拒绝和未决:如果p.then(f,r)立即将Job放入队列以调用函数f,则实现诺言p。如果p.then(f,r)立即使Job入队以调用函数r,则诺言p被拒绝。如果既未兑现也未兑现承诺,则该承诺尚未完成。如果未兑现承诺,即已兑现或拒绝,则称已兑现承诺。
如果已解决承诺,或者已将其“锁定”以匹配另一个承诺的状态,则该承诺会解决。尝试解决或拒绝已解决的承诺没有任何效果。如果未解决承诺,则无法解决。未解决的承诺始终处于待处理状态。已解决的承诺可能尚未完成,已实现或被拒绝。