【发布时间】:2016-03-29 21:15:31
【问题描述】:
我发现可以(在 ES6 承诺中,在创建 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() 函数中首先解析/拒绝将影响执行流程。
所以我的问题是 - 为什么它会这样工作(功能/错误)?
附:我的环境是 Node 4.1
附言我的输出:
Status #1: Promise { <pending> }
Resolve 1
Value after: 1
Status #2: Promise { 1 }
Resolve 2
Status #3: Promise { 1 }
【问题讨论】:
-
不是功能,不是错误,Promise/A+ 的规范中没有任何内容表明后续尝试解决或拒绝是错误的,只是一旦实现/拒绝,承诺仍然存在以不可变的价值/原因实现/拒绝
-
根据您的代码示例,您看到的控制台输出是什么?
-
我认为您误解了 Promise 的关键原则 -
then回调仅在 Promise 被解决(履行或拒绝)时触发一次。而这里就是这样,你可以在控制台中轻松查看;即使执行了resolve(2)行,也不会调用相应的then参数函数。 -
did not allow to execute after resolve- 这听起来不可能 - 甚至无法看到它是如何用 javascript 编写的 -
嗯,这不是 Promise 的工作方式或可以工作的方式。它们都是普通的 Javascript 函数,函数执行不能被外部杀死。 Promise 所做的只是允许您同步执行两个相关的异步代码(让
then等待,直到另一段代码发出信号)。不多也不少。并不意味着信号员已经或应该被杀死。
标签: javascript promise ecmascript-6 es6-promise