JS Promises - 当只有单个路径是异步时if-else流

时间:2015-07-22 09:29:00

标签: javascript promise bluebird

我正在重写一些使用sync ajax构建的遗留代码(非常糟糕)。现在我使用Promises(特别是Bluebird)。在很多情况下,函数有很多路径,只有一个是异步的。

问题是我必须识别所有路径并手动从每个路径返回新的承诺。像这样:

function syncFn() {
    // sync code return
}
function asyncFn() {
    // some async code here that return Promise
}
function myMegaFunction() {
    if ( ... ) {
        return Promise.resolve(syncFn());
    }
    else if ( ... ) {
        if ( ... ) {
            return Promise.resolve(syncFn());
        }
        else if ( ... ) {
            return Promise.resolve(syncFn());
        }
        else {
            return asyncFn(); // only async function here
        }
    }
    else {
        return Promise.resolve();
    }
}

是否有某种方法或模式可以简化这一点?也许是这样的 - 如果返回undefined,那么换成空的承诺?

2 个答案:

答案 0 :(得分:2)

简单

function myMegaFunction() {
    if ( ... ) {
        syncFn();
    }
    else if ( ... ) {
        if ( ... ) {
            syncFn();
        }
        else if ( ... ) {
            syncFn();
        }
        else {
            return asyncFn(); // only async function here
        }
    }
    return Promise.resolve();
}

不是很多......但更简单

当你在一个需要完成的地方返回asyncFn时,你可以简单地返回一个Promise.resolve()......实际上......让我编辑一下,我只是注意到了......

function myMegaFunction() {
    if ( ... ) { //A
        ;
    }
    else if ( ... ) { //B
        if ( ... ) { //C
            ;
        }
        else if ( ... ) { // D
            ;
        }
        else {
            return asyncFn(); // only async function here
        }
    }
    synchFn();
    return Promise.resolve();
}

可以写成

function myMegaFunction() {
    if(!A && B && !C && !D) {
        return asyncFn();
    }
    synchFn();
    return Promise.resolve();
}

编辑::不完全 - 但是关闭 - 那个synchFn是一个婊子

function myMegaFunction() {
    if(!A && B && !C && !D) {
        return asyncFn();
    }
    if(A || B) {
        synchFn();
    }
    return Promise.resolve();
}

答案 1 :(得分:1)

您可以使用Promise.method帮助程序:

var myMegaFunction = Promise.method(function myMegaFunction() {
    // return values
    // throw errors
    // return promises
});

...而myMegaFunction(…)将始终返回承诺。它会自动捕获异常,并将函数的结果包装在Promise.resolve(…)