javascript - 在 Promise 构造函数之外公开 resolve() 和 reject() 有什么缺点吗?

标签 javascript promise es6-promise

<分区>

我创建了这个小助手来在 Promise 的构造函数之外公开 resolvereject

export function createPromise() {
    let resolve,reject;
    let promise = new Promise((r,j) => {
        resolve = r;
        reject = j;
    });
    Object.assign(promise,{resolve,reject});
    return promise;
}

因为有时将整个脚本包装在

中真的很尴尬
new Promise((resolve,reject) => { 
   // hundreds of lines of code, most which have nothing 
   // to do with this Promise but I need the Promise object 
   // at the top level somewhere so that I can expose it, 
   // but it won't be resolved until some deeply nested construct is hit  
})

或者举个更具体的例子:

let p1 = kb.createPromise();
let p2 = kb.createPromise();

Promise.all([p1,p2]).then(() => {
    $('#calendar-bookings').scrollIntoView({
        duration: 200,
        direction: 'y'
    });
});

$('#bookings-table')
    .dataTable(getOptions(dtSourceUrl, {date, driverOptions}))
    .one('draw.dt', () => p1.resolve());

ReactDOM.render(<VehicleTimeline start={dateMom.toDate()} onLoad={() => p2.resolve()}/>, document.getElementById('vehicle-timeline'));

这样我也不必担心 resolve() 在我什至有机会绑定(bind)我的 .then 之前是否被同步调用。 [我的观点是正确的,.then 会立即触发]我认为这很清楚:创建两个 promise,绑定(bind) .then只有在之后,他们才可能得到解决。

当然,这将允许您将 Promise 传递给的任何人来解决它(即将控制权从 Promise 创建者和消费者手中夺走)但是如果消费者提前解雇它,那是他们的损失,因为大概他们是对事件感兴趣的人,不是吗?

此外,这将使消费者能够 reject() Promise,他们可以将其滥用为一种 Promise 取消。我并不是说这是个好主意,但我认为额外的自由也不一定是坏事。

还有什么我想念的吗?我的 createPromise 方法有什么问题吗?

最佳答案

这是 deferred 模式的变体,不同之处在于您在 promise 对象中使用解析/拒绝函数返回 promise 对象。原始的 deferred 模式创建了一个对象,该对象分别具有 promise 和解析/拒绝功能。因此,您可以在不暴露控件的情况下传递 promise 。

老实说,很少有地方需要真正突破构造函数范围。在我看来,与构造函数模式相比,使用此模式犯错并以 Unresolved promise 结束要容易一些。据我所知,与延迟模式相比,构造函数模式的唯一好处是您可以立即抛出并拒绝 promise (通过同步错误)。

关于javascript - 在 Promise 构造函数之外公开 resolve() 和 reject() 有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46737972/

相关文章:

Javascript 数组效率低下的问题

javascript - onbeforeunload 在 chrome 上不起作用

javascript - 如何使用强标签使字符串中的一个单词加粗

node.js - 使用 should.js 履行 promise 后执行自定义测试的语法是什么?

javascript - 按顺序运行 Promise

node.js - 返回 Promise 的 jest.spyOn 方法

JavaScript promise : Deep nested context with bind(this)

javascript - 如何创建一个 Angular Directive(指令)来加载jquery?

promise - Pharo promise :

javascript - 无法解决 redux reducer 函数中的 axios promise