如何将2个Javascript函数组合成一个?
我有以下函数,我想重用它作为一个“动作”模板并传递另一个函数作为参数,它将是<强>动作函数,在中间执行。>/P> 问题 可能吗?我怎么做 注意,“action”是异步的,而且我使用的是React如何将2个Javascript函数组合成一个?,javascript,reactjs,Javascript,Reactjs,我有以下函数,我想重用它作为一个“动作”模板并传递另一个函数作为参数,它将是动作函数,在中间执行。>/P> 问题 可能吗?我怎么做 注意,“action”是异步的,而且我使用的是React function templateAction(action) { try { setLoading(true); setError(null); // DO SOMETHING action(); setLoading(false)
function templateAction(action) {
try {
setLoading(true);
setError(null);
// DO SOMETHING
action();
setLoading(false);
}
catch(err) {
console.log(err);
setError(err);
setLoading(false);
}
}
在该action()
调用中,应执行以下函数:
async function getBlogPost() {
const querySnapshot = await firebase.firestore().collection('blog').where('slug','==',props.match.params.slug).get();
console.log(querySnapshot.docs);
if (querySnapshot.docs.length === 0) {
throw 'ERROR: BlogPost not found...';
} else if (querySnapshot.docs.length > 1) {
throw 'ERROR: More than 1 blogPost found...';
}
const blogPostData = querySnapshot.docs[0].data();
setFirestoreID(querySnapshot.docs[0].id);
setBlogPost(blogPostData);
}
片段
我认为我已经构建了所需的行为(运行代码片段)。我能做得比那简单些吗?似乎有很多陈词滥调
异步函数模板动作(动作){
试一试{
log('调用操作之前的模板操作');
等待行动();
log('调用操作后的模板操作');
}
捕捉(错误){
控制台日志(err);
}
}
函数动作(){
返回新承诺(异步(解析、拒绝)=>{
log('我在异步调用之前从操作函数同步');
等待mockAPI();
log('我在异步调用后从操作函数同步');
解决();
});
}
函数mockAPI(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
log('我来自异步mockAPI调用');
解决();
},1500);
});
}
模板动作(动作)代码>您可以通过如下匿名函数传递:
对于异步部分,可能需要做出承诺,这取决于是否需要对操作进行确认。
使用reactJS,您可以通过使用作用域发送属性和使用“this.props”获取来简化此过程。您可以通过以下匿名函数传递:
对于异步部分,可能需要做出承诺,这取决于是否需要对操作进行确认。
使用reactJS,您可以通过使用作用域发送属性和使用“this.props”获取来简化此过程。这是我的最后一段代码,使用try-catch块捕获错误
虽然我认为这会损害可读性,但它还是有效的
异步函数模板动作(动作){
试一试{
log('调用操作之前的模板操作');
等待行动();
log('调用操作后的模板操作');
}
捕捉(错误){
console.log(“我被抓到并记录在案”);
控制台日志(err);
}
}
函数动作(){
返回新承诺(异步(解析、拒绝)=>{
试一试{
log('我在异步调用之前从操作函数同步');
等待mockAPI();
log('我在异步调用后从操作函数同步');
解决();
}
捕捉(错误){
log(“我被抓住了”);
拒绝(错误);
}
});
}
函数mockAPI(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
log('我来自异步mockAPI调用');
解决();
},1500);
});
}
模板动作(动作)代码>这是我的最后一段代码,使用try-catch块捕获错误
虽然我认为这会损害可读性,但它还是有效的
异步函数模板动作(动作){
试一试{
log('调用操作之前的模板操作');
等待行动();
log('调用操作后的模板操作');
}
捕捉(错误){
console.log(“我被抓到并记录在案”);
控制台日志(err);
}
}
函数动作(){
返回新承诺(异步(解析、拒绝)=>{
试一试{
log('我在异步调用之前从操作函数同步');
等待mockAPI();
log('我在异步调用后从操作函数同步');
解决();
}
捕捉(错误){
log(“我被抓住了”);
拒绝(错误);
}
});
}
函数mockAPI(){
返回新承诺((解决、拒绝)=>{
设置超时(()=>{
log('我来自异步mockAPI调用');
解决();
},1500);
});
}
模板动作(动作)代码>将templateaction更改为异步函数,并将getBlog文章的正文复制到所需的位置。也就是说,保留许多较小的函数通常比保留几个较大的函数更好。@Carcigenicate我编辑过,因为它不是很清楚。我的意思是,我希望另一个函数在这一点上执行。该action()
调用应执行作为参数传递的函数。我想让它可重用,以便与其他操作
一起使用,而不是getBlogPost
@Iwrestledabearonce。但是我想把它们分开,这样我就可以重用模板操作
,否则我就需要为每个操作
使用相同的模板,比如getBlogPost
@Carcigenicate,我想我很接近了。我仍然在测试异步调用会发生什么。我想我需要使模板
异步,并使操作
返回一个承诺。我将很快编辑一个带有更简单功能的片段将templateaction更改为异步函数,并将getBlog文章的正文复制到您想要的地方。也就是说,保留许多较小的函数通常比保留几个较大的函数更好。@Carcigenicate我编辑过,因为它不是很清楚。我的意思是,我希望另一个函数在这一点上执行。该action()
调用应执行作为参数传递的函数。我想让它可重用,以便与其他操作
一起使用,而不是getBlogPost
@Iwrestledabearonce。但是我想把它们分开,这样我就可以重用模板操作
,否则我就需要为每个操作
使用相同的模板,比如getBlogPost
@Carcigenicate,我想我很接近了。我仍然在测试异步调用会发生什么。我想我需要使模板
异步,并使操作
返回一个承诺。我将很快编辑一个具有更简单功能的代码段with promise将类似于with promise将类似于
function templateAction(action) {
action();
}
let test = function() {
alert("test");
};
templateAction(test);