2017-07-13 5 views
0

ので、戻り値を取得するための約束を使用し、私はそうのようなPromise<T>でページメソッドをラップ:ページメソッドを中止だけでなく、

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

(それよりもう少し複雑、それは基本的にはこれだけです)

しかし、私がしたいことは、ページメソッドを中止することもできるということです。これは代わりにwindow.PageMethods._staticInstance.SomeMethodを呼び出すことによって行われ、ページメソッドを中止するために使用できるリクエストオブジェクトを返します。次のようなものがあります。

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

... 

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

それは私が約束のうち、要求を取得することはできませんが、私はまた、約束の中からページメソッドを呼び出していないことはできません

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

...私はそれはおそらく推測され、これまで不可能と感じています。クロージャー・トリックか2つの約束を使ってこの問題を回避することができる可能性は少し低いかもしれませんが、これまでのところそれを把握することはできませんでした。

答えて

0

私は「クロージャートリック」を使って解決したと思います。

私がページメソッドに渡す関数は後で定義することはできませんが、後で定義される関数を呼び出すことはできますが、関数を呼び出すことができます。さらに、promise executorは即座に実行されるため、これは機能します。

まだ存在しないハンドラプレースホルダを2つ作成し、ページメソッドに与えるハンドラからハンドラプレースホルダが存在する前に呼び出します。

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

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

不完全なハンドラを渡して、約束外のページメソッドを呼び出します。ページメソッドはまだそれらを使用しないので、それらが不完全であることは大丈夫です。

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

は今の約束を作成し、約束のexecutor機能では、我々は今、約束の解決への呼び出しで私たちのハンドラを定義し、機能を拒否します。 (実際、私は、彼らが実際にちょうど決意を割り当てることが直接の機能そのものを拒否することができることに気づいた。)

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

今、私たちは約束し、要求と要求が約束から解放されるの両方を持っています。これは、promiseがexecutor関数をすぐに呼び出すためですが、pageメソッドは、成功するまで呼び出しず、後で処理するまでハンドラを失敗させます。

私は、このトリックが他の状況で非常に役に立つと思われます。

関連する問題