簡體   English   中英

如何將2個Javascript函數合二為一?

[英]How to combine 2 Javascript functions into one?

我有以下函數,我想將其重新用作“動作”模板,並將另一個函數作為參數傳遞,該參數將作為動作函數在其中間執行。

可能嗎? 我該怎么做?

注意,“動作”是異步的,而且我也在使用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);
  }

SNIPPET

我認為我已經建立了所需的行為(運行摘要)。 我可以做得比這簡單嗎? 似乎很多樣板。

 async function templateAction(action) { try { console.log('Template Action BEFORE calling action'); await action(); console.log('Template Action AFTER calling action'); } catch(err) { console.log(err); } } function action() { return new Promise(async (resolve,reject) => { console.log('I am sync from action function BEFORE async call'); await mockAPI(); console.log('I am sync from action function AFTER async call'); resolve(); }); } function mockAPI() { return new Promise((resolve,reject) => { setTimeout(() => { console.log('I am from async mockAPI call'); resolve(); },1500); }); } templateAction(action); 

您可以像這樣通過匿名函數傳遞: https : //codesandbox.io/embed/awesome-mayer-52ix7

function templateAction(action) {
  action();
}

let test = function() {
  alert("test");
};

templateAction(test);

對於異步部分,也許您需要做出承諾,具體取決於是否需要確認操作。 使用reactJS,您可以通過使用范圍發送屬性並使用“ this.props”來使其更簡單。

這是我的最終代碼,使用try catch塊捕獲錯誤。

盡管我認為這樣做會損害可讀性,但它確實有效。

 async function templateAction(action) { try { console.log('Template Action BEFORE calling action'); await action(); console.log('Template Action AFTER calling action'); } catch(err) { console.log('I was caught and logged'); console.log(err); } } function action() { return new Promise(async (resolve,reject) => { try { console.log('I am sync from action function BEFORE async call'); await mockAPI(); console.log('I am sync from action function AFTER async call'); resolve(); } catch(err) { console.log('I was caught'); reject(err); } }); } function mockAPI() { return new Promise((resolve,reject) => { setTimeout(() => { console.log('I am from async mockAPI call'); resolve(); },1500); }); } templateAction(action); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM