2017-11-27 6 views
0

Ich versuche, Async-Funktion # 1 mit einigen Async-Funktion # 2 zu dekorieren.Typoskript, verzieren asynchrone Funktion

z.

function func2(param) { 
    return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => { 
    //make async operations and then return descriptor 
} 


@func2(param) 
async function func1() { 
    await .... //some async operation 
    await .... //some async operation 
} 

So ist die Hauptidee ist, einen Asynchron-Betrieb in Dekorateur, durchzuführen und dann andere Asynchron-Anrufen in der Hauptfunktion ausführen.

Ist es möglich, diese mit Typoskript Dekoratoren zu machen?

Vielen Dank im Voraus.

Antwort

0

Zierer können nur auf einer Klassenmethode nicht auf einer regulären Funktion verwendet werden, so dass eine Einschränkung ist, aber wenn Sie die Funktion innerhalb einer Klasse setzen können Sie bequem die ursprüngliche Funktion und führen auch andere Asynchron-Aufgaben ersetzen:

function func2(param: number) { 
    return (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(... params: any[])=> Promise<any>>) => { 
     let oldFunc = descriptor.value; 
     descriptor.value = async function(){ 
      var result = await oldFunc.apply(this, arguments); 
      await delay(param) //some async operation 
      console.log("delay 3"); 
      return result; 
     } 
    } 
} 

class Test { 
    @func2(1000) 
    async func1(timout: number) { 
     await delay(timout) //some async operation 
     console.log("delay 1"); 
     await delay(timout) //some async operation 
     console.log("delay 2"); 
    } 
} 

new Test().func1(1000); 
// Util function 
async function delay(timeout: number) { 
    return new Promise<void>((resolve) => setTimeout(() => { 
     resolve(); 
    }, timeout)); 
} 
Verwandte Themen