Javascript 使用nodejs避免承诺中的回调地狱

Javascript 使用nodejs避免承诺中的回调地狱,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我已经使用Promissions在nodejs中编写了大约六个函数,我真的想发布所有这些代码,相反,我将发布一个模拟示例,以便能够简洁地封装我的问题。假设我有以下两个函数: foo = () => { return new Promise( ( r , rj ) => { setTimeout( () => { r('DONE'); }, 3000 ); }); } 及 现在,我希望避免回调地狱,并执

我已经使用Promissions在nodejs中编写了大约六个函数,我真的想发布所有这些代码,相反,我将发布一个模拟示例,以便能够简洁地封装我的问题。假设我有以下两个函数:

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

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

foo().then( (resp) => console.log(resp) ).bar()
相反,我被迫做的是:

foo().then( (resp) => { console.log(resp); bar() } )
因此,到目前为止,在我的产品代码中基本上有如下内容(只是给你一个想法):


现在,我怎样才能以链的形式写这篇文章,而不是用回调的形式写这篇文章呢?

我的想法是总是要回报一个承诺:

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);
    });

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

我们的想法是始终返回一个承诺:

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);
    });

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

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

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

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
    }
有关更多信息,请查看此链接:
(或者只需谷歌“js async await”,你会发现更多:)

一个技巧是检查async/await语法。它基本上使编写类似于同步代码的异步代码成为可能

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

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
    }
有关更多信息,请查看此链接:
(或者只需谷歌“js async await”,你会发现更多:)

你有什么理由不能使用async/await吗?有什么原因不能使用async/await吗?您可以使用
then(volt\u CreatePresentation)
之类的方法进一步简化,而不是将其包装在另一个匿名函数中。在这种情况下,当然可以!好的,看起来很棒!谢谢我会试试看,请给我时间接受。t您可以使用
then(volt\u CreatePresentation)
之类的工具进一步简化,而不是将其包装在另一个匿名函数中。在这种情况下,当然可以!好的,看起来很棒!谢谢我会试试看,请给我时间接受。泰