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