在使用Node.js的Promise中避免回调地狱

时间:2018-12-09 18:46:16

标签: javascript node.js es6-promise

我已经使用诺言在nodejs中编写了大约六个函数,我想真正发布所有这些代码,相反,我将发布一个模拟示例,以便我可以简单地封装我的问题。所以说我下面有2个功能:

foo = () => {
    return new Promise( ( r , rj ) => {
       setTimeout( () => {
             r('DONE');
       }, 3000 );
    }); 
}  

还有

bar = () => {
    return new Promise( (r , rj) => { r('ALL DONE !') } )
}

现在,我想避免回调地狱,并执行以下操作:

foo().then( (resp) => console.log(resp) ).bar()

相反,我被迫要做的是:

foo().then( (resp) => { console.log(resp); bar() } )

所以基本上,在我的生产代码中,到目前为止,我有类似下面的内容(只是给你一个主意):

let uploadToVault = ( INPUT_DIR , VOLT_CRED ) => {

    INPUT_DIRECTORY = INPUT_DIR;
    VOLT_CREDENTIALS = VOLT_CRED;

    volt_APILogin().then( () => {
        volt_getProduct().then( () => {
           volt_CreatePresentation().then( (resp) => {
                console.log(resp);        
                volt_uploadSlides().then( (resp) => {
                    console.log(resp);
                    volt_bindSlide().then( (resp) => {
                        console.log(resp);
                    });
                });
           });  
        });
    });
}

现在我该如何以链式格式编写而不是在回调中编写此格式?

2 个答案:

答案 0 :(得分:4)

想法是始终兑现承诺:

volt_APILogin()

    .then(() => {
        return volt_getProduct();
    })
    .then(() => {
         return volt_CreatePresentation();
    })
    .then((resp) => {
         console.log(resp);        
         return volt_uploadSlides();
    })
    .then((resp) => {
         console.log(resp);
         return volt_bindSlide();
    })
    .then((resp) => {
         console.log(resp);
         return Promise.resolve('just for fun');
    })
    .then((resp) => {
         console.log("This round is", resp);
    });

然后,如果您需要在链中使用中间值,只需将它们收集到链外的变量中即可。

答案 1 :(得分:2)

一个技巧是检查异步/等待语法。基本上可以编写类似于同步代码的异步代码。

因此,如果您具有此功能:

bar = () => {
    return new Promise( (r , rj) => { r('ALL DONE !') } )
}

然后您可以这样称呼它:

let fizz = async () => {
    const result = await bar();
    console.log(`Bar said: ${result}`);
};

对于错误处理,您可以将等待的函数调用包装在try-catch块中:

    try {
        const result = await bar();
        console.log(`Bar said: ${result}`);
    } catch {
        // Handle the error
    }

查看此链接以获取更多信息:https://javascript.info/async-await (或者只是谷歌“ js async await”,您会发现更多的内容:))