[英]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.