2017-07-13 2 views
0

So wickle ich wie so in einem Promise<T> Seite Methoden zu erhalten:Abbruch eine Methode Seite, sondern auch ein Versprechen verwendet den Rückgabewert

return new Promise<T>((done, fail) => 
    window.PageMethods.SomeMethod(arg1, arg2, done, fail) 
); 

(etwas komplizierter als das, aber das ist im Grunde hat es)

Aber was ich tun möchte, ist in der Lage, auch die Seite Methode abzubrechen. Dies geschieht, indem stattdessen window.PageMethods._staticInstance.SomeMethod aufgerufen wird, was ein Anfrageobjekt zurückgibt, mit dem die Seitenmethode abgebrochen werden kann. Etwas wie:

const request = window.PageMethods._staticInstance.SomeMethod(arg1, arg2, done, fail); 

... 

const executor = request.get_executor(); 
if (executor.get_started()) 
    executor.abort(); 

Ok, aber wie kann ich diese beiden Prozesse kombinieren? Es fühlt sich so weit unmöglich, was ich denke, es ist wahrscheinlich ...

return new Promise<T>((done, fail) => { 
    const request = window.PageMethods._staticInstance.SomeMethod(arg1, arg2, done, fail); 
    // do what with request??? 
}); 

ich nicht die Anforderung aus dem Versprechen bekommen, aber ich kann auch nicht die Seite nicht Methode aus dem Versprechen nennen. Ich habe das Gefühl, dass es eine kleine Chance geben könnte, dass ich dieses Problem umgehen könnte, indem ich entweder einen Abschlusstrick anwende oder zwei Versprechungen verwende, aber ich konnte es bisher nicht herausfinden.

Antwort

0

Ok Ich denke, ich habe es gelöst, indem ich einen 'Schließtrick' benutzt habe.

Die Funktionen, die ich an die Seitenmethode übergebe, können später nicht definiert werden, aber sie können Funktionen aufrufen, die später definiert werden. Da der Promend Executor sofort ausgeführt wird, funktioniert dies außerdem.

Erstellen Sie zwei Handler-Platzhalter, die noch nicht existieren, und rufen Sie sie auf, bevor sie von den Handlern existieren, die wir der Seitenmethode geben werden.

let deferredResolve: (value: T) => void; 
const lazySuccess = value => deferredResolve(value); 

let deferredReject: (result?: any) => void; 
const lazyFail = result => deferredReject(result); 

Rufen Sie die Seitenmethode außerhalb des Versprechens auf und übergeben Sie die unvollständigen Handler. Die Seitenmethode wird sie noch nicht verwenden, daher ist es in Ordnung, dass sie unvollständig sind.

const request = 
    window 
    .PageMethods 
    ._staticInstance 
    .SomeMethod(arg1, arg2, lazySuccess, lazyFail); 

Erstellen Sie nun ein Versprechen, und in den Executor-Funktion Versprechen, wir jetzt unsere Handler mit Aufrufen an die Versprechen lösen definieren und Funktionen ablehnen. (In der Tat stellte ich fest, dass sie eigentlich nur die Entschlossenheit zugewiesen werden und lehnen Funktionen selbst direkt.)

const promise = new Promise<T>((resolve, reject) => { 
    deferredResolve = resolve; 
    deferredReject = reject; 
}); 

Jetzt haben wir beide ein Versprechen und eine Anforderung und die Anforderung von dem Versprechen befreit. Dies funktioniert, weil das Versprechen seine Executor-Funktion sofort aufruft, aber die Page-Methode ihre Erfolgs- und Fehlerbehandlungsroutinen erst später aufruft.

Ich vermute, dass dieser Trick in anderen Situationen sehr nützlich sein könnte.

Verwandte Themen