在promise函数之前将Javascript函数链接为仅基于初始函数的调用
考虑以下正常工作的代码(以下函数通常位于在promise函数之前将Javascript函数链接为仅基于初始函数的调用,javascript,asynchronous,promise,async-await,es6-promise,Javascript,Asynchronous,Promise,Async Await,Es6 Promise,考虑以下正常工作的代码(以下函数通常位于API对象中): let Query=async函数(方法、端点、选项、成功代码、obKey){ 返回true; //返回新错误('无法完成查询!'); }; let isAlive=异步函数(选项){ 试一试{ 返回等待查询('GET','/heart',options,204); }捕获(错误){ 返回误差; } }; 让getNetworks=async函数(选项){ 试一试{ 返回等待查询('GET','/networks',options,20
API
对象中):
let Query=async函数(方法、端点、选项、成功代码、obKey){
返回true;
//返回新错误('无法完成查询!');
};
let isAlive=异步函数(选项){
试一试{
返回等待查询('GET','/heart',options,204);
}捕获(错误){
返回误差;
}
};
让getNetworks=async函数(选项){
试一试{
返回等待查询('GET','/networks',options,200,'networks');
}捕获(错误){
返回误差;
}
};
//标准承诺方法有效
isAlive()。然后(()=>{
getNetworks()。然后(结果=>{
日志('GET NETWORKS',result);
}).catch(错误=>{
log('GET NETWORKS ERROR',ERROR.message);
});
}
);
//但为了使代码库更干净,我怎么能只调用链中的下一个函数呢
//基于isAlive()函数?
在您的示例中,您只需将函数引用传递给然后
方法:
isAlive().then(getNetworks).then( result => {
console.log( 'GET NETWORKS', result );
}).catch( error => {
console.log( 'GET NETWORKS ERROR', error.message );
});
尝试避免嵌套承诺确实是一种很好的做法,而是将每个承诺返回到外部承诺链。您可以在
承诺
原型上定义一个方法,尽管您需要在方法中使用.then()
Promise.prototype.getNetworks = function(value) {
// do stuff
return this.then(function(data) {
// do stuff
return data
})
.catch(function(err) {
throw err
})
};
然后可以使用该模式
isAlive().getNetworks();
看看这是否有帮助
async function myFunc() {
throw new Error("Whoops!");
}
在调用中,您可以捕获错误(拒绝)
return wait fn()
永远不需要。只需执行返回fn()
。另外值得注意的是,isAlive()
的编码方式从不拒绝,因此从不使用.catch()
。但是,这可能是isAlive()
编写方式上的一个错误。
myFunc()
.catch(function(rej, resolve)
{console.log(`in the catch block rej ${rej}`
)});