猿问

如何打破承诺链

我这样承诺


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 不能被修改。


我如何在第一场比赛中脱颖而出?(除了显式抛出错误以外,还有其他方法吗?)


蝴蝶不菲
浏览 375回答 3
3回答

拉风的咖菲猫

我想你不想在这里连锁。以同步方式,您可能已经写过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诺言没有变平。

HUX布斯

除了显式抛出错误之外,还有其他方法吗?您可能需要扔东西,但这不一定是错误。大多数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.    });
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答