在ES6 Promise中允许多次解析/拒绝的原因是什么
What is the reason to allow multiple resolve/reject in ES6 Promise
我发现(在ES6 Promise中,在创建Promise对象时)可以使用多次解析/拒绝,这只会影响PromiseStatus一次,但不会影响执行流。
var p = new Promise(function(resolve, reject) {
setTimeout(function(){
resolve(1);
console.log('Resolve 1');
}, 50);
setTimeout(function(){
resolve(2);
console.log('Resolve 2');
}, 100);
});
setTimeout(function(){
console.log('Status #1:', p);
}, 10);
setTimeout(function(){
console.log('Status #2:', p);
}, 60);
setTimeout(function(){
console.log('Status #3:', p);
}, 110);
p.then(function(x){
console.log('Value after:', x)
})
在then()
函数中,第一个解析/拒绝将影响执行流程。所以我的问题是——为什么它会这样工作(功能/bug)?
p.S.我的环境是节点4.1
p.p.S.我的输出:
Status #1: Promise { <pending> }
Resolve 1
Value after: 1
Status #2: Promise { 1 }
Resolve 2
Status #3: Promise { 1 }
好吧,我想谈谈为什么。Promise是单个值的代理,因此第二次运行处理程序或更改值没有意义。例如,你不能把数字5改成数字3。
让我们讨论一下resolve
第二次被调用的替代方案。比方说,我们不想允许这样做——我们将如何发出信号?
通常,我们会使用throw
——问题是——它会在任何地方被捕获,因为promise构造函数中的throw
会被转换为拒绝。.catch
处理程序将不会运行,因为promise已解析。
所以我们不能真的扔,因为这意味着一个你无法处理的异常(一个非常糟糕的地方)。我们不能运行两次处理程序(那样会破坏模型)。所以我们剩下的唯一选择就是允许它。
根据ECMAScript 2015规范,Promise Reject Functions和Promise Resolve Functions部分指出,
- 如果已解决。[[value]]为true,返回未定义
因此,如果当前promise对象已经被解析,那么既不解析也不拒绝对promise对象执行任何操作。这实际上意味着,只有第一个解决/拒绝问题。
相关文章:
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- JSDoc:模块和名称空间之间的关系是什么
- 在ES6 Promise中允许多次解析/拒绝的原因是什么