为什么在Promise语法中使用作为参数的功能(解析,拒绝),而不是简单的返回和抛出?

时间:2019-03-09 22:53:06

标签: javascript promise es6-promise

这是一个“为什么”问题,而不是建议。我知道以下函数是不正确的,但有助于阐明我的问题:我想知道此视图有什么问题(即我在这里缺少Promise的要求)。答案可以帮助像我这样的人摆脱困惑。请提供一个示例,其中必须满足Promise的以下要求:

I(错误地)假定了Promise用于推迟执行功能并分配then&catch链。我需要了解以下内容:为什么JavaScript Promise使用(解析,拒绝)而不是返回或引发的无参数回调?

在幼稚和不正确的视图中,可以像下面这样以更简单的方式使用Promise(没有两个参数resolvereject):

/*new*/ IncorrectPromise(()=>{
    let x = Math.random()>0.5;
    console.log('promise 1');
    if (x) {
        return 'head1';
    } else {
        throw new Error('tail1');
    }
})
.then((d)=>{
    console.log('.then() d=', d);
})
.catch( (ex) =>{
    console.log('.catch() e=', ex.message);
});

代替承诺的方式:

new Promise( (resolve_, reject_) => {
    let y = Math.random()>0.5;
    console.log('promise 2');
    if (y) {
        resolve_('head2');
    } else {
        reject_(new Error('tail2'));
    }
})
.then((d)=>{
    console.log('              .then() d=', d);
})
.catch( (ex) =>{
    console.log('              .catch() e=', ex.message);
});

即当控制流退出promise回调的主体时,根据退出是由return还是throw引起的,使用resolve或拒绝。

我的问题是,为什么Promise使用当前语法?答案将是使用此(自然)功能无法完成的示例。

可以通过以下定义轻松地模拟上述语法(为简单起见,请忽略IncorrectPromise不是构造函数,因此不需要new运算符的事实):

function IncorrectPromise(callback) {
    return new Promise( (res, rej) => {
        try {
            res( callback() );
        } catch (err) {
            rej(err);
        }
    });
}

这种简单的用法语法的缺点是什么?设计者或Promise使用(解析,拒绝)的意图是什么?

0 个答案:

没有答案