javascript - 在 ES6 Promise 中允许多次解析/拒绝的原因是什么

标签 javascript promise ecmascript-6 es6-promise

我发现可以(在 ES6 promises 中,创建 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会影响执行流程。 所以我的问题是 - 为什么它会这样工作(功能/错误)?

附言我的环境是 Node 4.1

附言我的输出:

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 已经解决。

所以我们不能真正抛出,因为那意味着您无法处理异常(一个非常糟糕的地方)。我们不能运行处理程序两次(那会破坏模型)。所以我们唯一的选择就是允许它。

关于javascript - 在 ES6 Promise 中允许多次解析/拒绝的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34435632/

相关文章:

javascript - 将 knockout 绑定(bind)应用于模板并获取字符串形式的结果

javascript - 如何从服务( native 脚本/firebase)中使用 Promise?

angular - 在 Angular 2 中使用回调还是使用 Promise 哪个更好?

node.js - 使用 NodeJs 异步查询 redshift 集群

node.js - 如何通过 webpack 导入 jQuery 插件并将其放在 $/jQuery 下? (ES6 + typescript )

javascript - 有没有办法用 eslint 来检查特定的变量名

javascript - 如何删除事件监听器?

javascript - 从另一个函数更改函数内的变量,最好的方法是什么?

javascript - 转换对象模型最有效的方法是什么?

javascript - innerHTML 与 XML 元素一起使用吗?