Javascript 使用nodejs避免承诺中的回调地狱
我已经使用Promissions在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 ); }); } 及 现在,我希望避免回调地狱,并执
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)
之类的工具进一步简化,而不是将其包装在另一个匿名函数中。在这种情况下,当然可以!好的,看起来很棒!谢谢我会试试看,请给我时间接受。泰