如何将2个Javascript函数组合成一个?

如何将2个Javascript函数组合成一个?,javascript,reactjs,Javascript,Reactjs,我有以下函数,我想重用它作为一个“动作”模板并传递另一个函数作为参数,它将是动作函数,在中间执行。>/P> 问题 可能吗?我怎么做 注意,“action”是异步的,而且我使用的是React function templateAction(action) { try { setLoading(true); setError(null); // DO SOMETHING action(); setLoading(false)

我有以下函数,我想重用它作为一个“动作”模板并传递另一个函数作为参数,它将是<强>动作函数,在中间执行。>/P> 问题

可能吗?我怎么做

注意,“action”是异步的,而且我使用的是React

  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);