为了账号安全,请及时绑定邮箱和手机立即绑定

如何打破承诺链

如何打破承诺链

蝴蝶不菲 2019-11-02 10:18:36
我这样承诺function getMode(){    var deferred = Promise.defer();    checkIf('A')    .then(function(bool){        if(bool){            deferred.resolve('A');        }else{            return checkIf('B');        }    }).then(function(bool){        if(bool){            deferred.resolve('B');        }else{            return checkIf('C');        }    }).then(function(bool){        if(bool){            deferred.resolve('C');        }else{            deferred.reject();        }    });    return deferred.promise;}checkIf返回一个promise,yes checkIf 不能被修改。我如何在第一场比赛中脱颖而出?(除了显式抛出错误以外,还有其他方法吗?)
查看完整描述

3 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

我想你不想在这里连锁。以同步方式,您可能已经写过


function getMode(){

    if (checkIf('A')) {

        return 'A';

    } else {

        if (checkIf('B')) {

            return 'B';

        } else {

            if (checkIf('C')) {

                return 'C';

            } else {

                throw new Error();

            }

        }

    }

}

这就是应如何将其转化为承诺:


function getMode(){

    checkIf('A').then(function(bool) {

        if (bool)

            return 'A';

        return checkIf('B').then(function(bool) {

            if (bool)

                return 'B';

            return checkIf('C').then(function(bool) {

                if (bool)

                    return 'C';

                throw new Error();

            });

        });

    });

}

if else诺言没有变平。


查看完整回答
反对 回复 2019-11-02
?
HUX布斯

TA贡献1876条经验 获得超6个赞

除了显式抛出错误之外,还有其他方法吗?


您可能需要扔东西,但这不一定是错误。


大多数promise实现都有catch接受第一个参数作为错误类型的方法(但不是全部,不是ES6 Promise),在这种情况下会很有帮助:


function BreakSignal() { }


getPromise()

    .then(function () {

        throw new BreakSignal();

    })

    .then(function () {

        // Something to skip.

    })

    .catch(BreakSignal, function () { })

    .then(function () {

        // Continue with other works.

    });

我增加了在我自己的Promise库的最近实现中中断的功能。如果使用的是ThenFail(可能不会),则可以编写如下代码:


getPromise()

    .then(function () {

        Promise.break;

    })

    .then(function () {

        // Something to skip.

    })

    .enclose()

    .then(function () {

        // Continue with other works.

    });


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 374 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信