中止页面方法,但也使用 Promise 获取 return 值

Abort a page method but also use a Promise to get the return value

所以,我将页面方法包装在 Promise<T> 中,如下所示:

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

(稍微复杂一点,但基本上就是这样)

但是,我想要做的是也能够中止页面方法。这是通过调用 window.PageMethods._staticInstance.SomeMethod 来完成的,其中 returns 是一个可用于中止页面方法的请求对象。类似于:

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???
});

我无法从 promise 中获取请求,但我也不能不从 promise 中调用页面方法。我觉得我可以使用闭包技巧或使用两个承诺来解决这个问题的可能性很小,但到目前为止我还没有弄清楚。

好的,我想我用 'closure trick'.

解决了这个问题

我传给page方法的函数不能在后面定义,但是可以调用后面定义的函数。此外,由于 promise 执行器是立即执行的,所以这是有效的。

创建两个尚不存在的处理程序占位符,并在它们存在之前从我们将提供给页面方法的处理程序调用它们。

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);

现在创建一个 promise,在 promise 的执行函数中,我们现在通过调用 promise 的 resolve 和 reject 函数来定义我们的处理程序。 (事实上​​我意识到他们实际上可以直接分配给 resolve 和 reject 函数。)

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

现在我们既有承诺又有请求,并且请求已从承诺中解放出来。这是可行的,因为 promise 会立即调用其执行程序函数,但 page 方法直到稍后才会调用其成功和失败处理程序。

我怀疑这个技巧在其他情况下可能非常有用。