在 Promise 函数之前链 Javascript 函数仅基于初始函数调用

Posted

技术标签:

【中文标题】在 Promise 函数之前链 Javascript 函数仅基于初始函数调用【英文标题】:Chain Javascript function before promise function to only call based on initial function 【发布时间】:2018-06-22 06:41:54 【问题描述】:

考虑以下正常工作的代码(下面的函数通常在API 对象内):

let Query = async function( method, endpoint, options, successCode, obKey )

    return true;
    //return new Error( 'Could not complete query!' );
    
;

let isAlive = async function( options )
	try 
		return await Query( 'GET', '/heart', options, 204 );
	 catch( error )
		return error;
	
;

let getNetworks = async function(options) 
	try 
		return await Query( 'GET', '/networks', options, 200, 'networks' );
	 catch( error )
		return error;
	
;

// Standard promise method works
isAlive().then( () => 
		getNetworks().then( result => 
			console.log( 'GET NETWORKS', result );
		).catch( error => 
			console.log( 'GET NETWORKS ERROR', error.message );
		);
	
);

// BUT to make for cleaner code base, how can I only call next function in chain
// based on isAlive() function?

如何处理isAlive() 函数以允许链接,但仅执行基于isAlive() 之后基于isAlive() 中的结果调用的基于Promise 的函数,如下所示?

isAlive().getNetworks().then( result => 
    console.log( 'GET HOMIE NETWORKS', result );
).catch( error => 
    console.log( 'GET HOMIE NETWORKS ERROR', error.message );
);

是的,我知道可以从async 函数内部以这种方式完成,但是,有时await isAlive(); 是不可能的......并且希望能够创建一个简单的辅助函数可以链接到...这可能吗?不用.then( ()=> ... )

Glot.IO:https://glot.io/snippets/exas8rbxyu JSFiddle:https://jsfiddle.net/tripflex/sj78297k/

我能够通过返回 this 找出一些基本的链接,但不知道如何使用 Promises 实现类似的东西。

var myObj = 
	hasPerms: false,
	check : function( doChain )
	    this.hasPerms = doChain;
		console.log( 'Checkinnngggg...' );
		return this;
	,
	then : function( callback )
	    if( this.hasPerms )
	        callback();
	     else 
	        return false;
	    
	
;

//"chain, chain, chain..."
myObj.check( false ).then( function()
    console.log( 'I GOT FOO\'D');
);

【问题讨论】:

return await fn() 永远不需要。只需return fn() 【参考方案1】:

看看有没有帮助

async function myFunc() 
throw new Error("Whoops!");

在调用这里,你可以捕获错误(reject)

myFunc()
.catch(function(rej, resolve)
   console.log(`in the catch block rej $rej`
));

【讨论】:

【参考方案2】:

您可以在 Promise 原型上定义方法,但您需要在方法中使用 .then()

Promise.prototype.getNetworks = function(value) 
  // do stuff
  return this.then(function(data) 
    // do stuff
    return data
  )
  .catch(function(err) 
    throw err
  )
;

然后你可以使用该模式

isAlive().getNetworks();

【讨论】:

【参考方案3】:

在您的示例中,您可以将函数引用传递给 then 方法:

isAlive().then(getNetworks).then( result => 
    console.log( 'GET NETWORKS', result );
).catch( error => 
    console.log( 'GET NETWORKS ERROR', error.message );
);

尝试避免嵌套承诺确实是一个好习惯,而是将每个承诺返回到外部承诺链。

【讨论】:

另外值得注意的是isAlive() 的编码方式,它从不拒绝,因此从不使用.catch()。但是,isAlive() 的写法可能是个错误。

以上是关于在 Promise 函数之前链 Javascript 函数仅基于初始函数调用的主要内容,如果未能解决你的问题,请参考以下文章

Promise -------JavaScrip

手写一个Promise

JavaScript小技能:原型链的运作机制Promise链

JavaScrip继承图文总结

javascrip函数简单介绍

如何确保 Node.js 中的这些函数链按顺序执行(使用 Promise)?