在 ES6 Promise 中允许多个 resolve/reject 的原因是什么
What is the reason to allow multiple resolve/reject in ES6 Promise
我发现可以(在 ES6 promise 中,创建 Promise 对象时)使用多个 resolve/reject,这只会影响 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()
函数中第一个resolve/reject会影响执行流程。
所以我的问题是 - 为什么它会这样工作 (feature/bug)?
P.S。我的环境是 Node 4.1
P.P.S。我的输出:
Status #1: Promise { <pending> }
Resolve 1
Value after: 1
Status #2: Promise { 1 }
Resolve 2
Status #3: Promise { 1 }
根据 ECMAScript 2015 规范,第 Promise Reject Functions and Promise Resolve Functions 节说,
- If alreadyResolved.[[value]] is true, return undefined.
因此,如果当前的 promise 对象已经被 resolve,那么 resolve 和 reject 都不会对 Promise 对象做任何事情。这实际上意味着,只有第一个 resolve/reject 重要。
好吧,我想谈谈为什么。 Promise 是单个值的代理,因此 运行 第二次处理程序或更改值没有意义。例如,您不能将数字 5 更改为数字 3。
让我们谈谈 resolve
第二次被调用时我们有哪些备选方案。假设我们不想允许它 - 我们将如何发出信号?
通常,我们 throw
- 问题是 - 它会被 无处捕获 因为承诺构造函数中的 throw
s 被转换为拒绝. .catch
处理程序不会 运行 因为承诺已经解决。
所以我们不能真正抛出,因为那意味着您无法处理异常(一个非常糟糕的地方)。我们不能 运行 处理程序两次(那会破坏模型)。所以我们唯一的选择就是允许它。
我发现可以(在 ES6 promise 中,创建 Promise 对象时)使用多个 resolve/reject,这只会影响 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()
函数中第一个resolve/reject会影响执行流程。
所以我的问题是 - 为什么它会这样工作 (feature/bug)?
P.S。我的环境是 Node 4.1
P.P.S。我的输出:
Status #1: Promise { <pending> }
Resolve 1
Value after: 1
Status #2: Promise { 1 }
Resolve 2
Status #3: Promise { 1 }
根据 ECMAScript 2015 规范,第 Promise Reject Functions and Promise Resolve Functions 节说,
- If alreadyResolved.[[value]] is true, return undefined.
因此,如果当前的 promise 对象已经被 resolve,那么 resolve 和 reject 都不会对 Promise 对象做任何事情。这实际上意味着,只有第一个 resolve/reject 重要。
好吧,我想谈谈为什么。 Promise 是单个值的代理,因此 运行 第二次处理程序或更改值没有意义。例如,您不能将数字 5 更改为数字 3。
让我们谈谈 resolve
第二次被调用时我们有哪些备选方案。假设我们不想允许它 - 我们将如何发出信号?
通常,我们 throw
- 问题是 - 它会被 无处捕获 因为承诺构造函数中的 throw
s 被转换为拒绝. .catch
处理程序不会 运行 因为承诺已经解决。
所以我们不能真正抛出,因为那意味着您无法处理异常(一个非常糟糕的地方)。我们不能 运行 处理程序两次(那会破坏模型)。所以我们唯一的选择就是允许它。