如何跳过其余的.then&将数据返回给调用者

时间:2017-09-27 23:14:51

标签: node.js promise bluebird

我想跳过所有的。然后在特定的.then之后。但是这个特殊的.then需要将数据返回给调用者。

function test() {    
    return User.findOne({ where: potentialUser })
        .then(function(user) { // level-1
            if(!user) {
                return { // data-1
                    status: 404,
                    json: { message: 'Not a valid user.' }
                };
            } else {
                return anyValidPromise;
            }
        })
        .then(function(isMatch) { // level-2

        })
        .then(function(val) { // level-3

        })
        .then(function(val) {

        })
        .then(function(val) {

        })
        .catch(function(error) {
            console.log(error);
            return {
                status: 500,
                json: { message: 'There was an error!' }
            };
        });
}

现在根据上面的例子,level-1必须将data-1返回给test的调用者。而且所有来自第二级的.then都不会被执行。

有可能实现这个目标吗?

如果所有.then都被执行,那么调用者将获得在.then的最后一级返回的数据。

1 个答案:

答案 0 :(得分:1)

Promise的一个优点是“毁灭金字塔”的“扁平化”

但有时,所需的逻辑需要一定程度的“嵌套”

这是一个这样的案例

function test() {    
    return User.findOne({ where: potentialUser })
    .then(function(user) { // level-1
        if(!user) {
            return { // data-1
                status: 404,
                json: { message: 'Not a valid user.' }
            };
        } else {
            return anyValidPromise
            .then(function(isMatch) { // level-2

            })
            .then(function(val) { // level-3

            })
            .then(function(val) {

            })
            .then(function(val) {

            })
        }
    )
    .catch(function(error) {
        console.log(error);
        return {
            status: 500,
            json: { message: 'There was an error!' }
        };
    });
}
  

重构,你可以做类似的事情(我不喜欢这样)

function test() {    
    let level4 = bar => {
        if(bar) {
            return {};
        } else {
            return {};
        }
    }
    let level3 = foo => {
        if(foo) {
            return {};
        } else {
            return level4(bar);
        }
    }
    let level2 = isMatch => {
        if(isMatch) {
            return {};
        } else {
            return level3(foo);
        }
    }
    let level1 = user => {
        if(!user) {
            return { // data-1
                status: 404,
                json: { message: 'Not a valid user.' }
            };
        } else {
            return anyValidPromise.then(level2)
        }
    };
    return User.findOne({ where: potentialUser })
    .then(level1)
    .catch(function(error) {
        console.log(error);
        return {
            status: 500,
            json: { message: 'There was an error!' }
        };
    });
}

不确定这是否有用,但原始代码是“稀疏的”:p

另一种可能性是滥用承诺拒绝链以获取您自己的邪恶手段

function test() {    
    return User.findOne({ where: potentialUser })
    .then(function(user) { // level-1
        if(!user) {
            throw { // data-1
                status: 404,
                json: { message: 'Not a valid user.' },
                skip: true
            };
        } else {
            return anyValidPromise;
        }
    })
    .then(function(isMatch) { // level-2
        if (youWantToSkipFromHere) {
            throw {
                status: ???
                json: ???
                skip: true
            };
        }
    })
    // etc etc
    .then(function(val) { // level-3
        if (youWantToSkipFromHere) {
            throw {
                status: ???
                json: ???
                skip: true
            };
        }
    })
    .catch(function(error) {
        if (error.skip) {
            return error;
        }
        console.log(error);
        return {
            status: 500,
            json: { message: 'There was an error!' }
        };
    });
}