gpt4 book ai didi

typescript - 可以在 Typescript 中向 Promise 添加取消方法吗?

转载 作者:搜寻专家 更新时间:2023-10-30 21:12:16 26 4
gpt4 key购买 nike

我想创建一个 QueryPromise,它只是一个带有取消方法的具体 promise 。以下是它的使用方式:

function runQuery(text: string): QueryPromise {
return new QueryPromise((resolve,reject) => {nativeQuery(resolve)})
}

这是我的第一次尝试,希望能很好理解:

interface CancellablePromise<T> extends Promise<T> {
cancel: () => void
}

// create the promise my app will use
type QueryPromise = CancellablePromise<string|boolean>

但这还不够。

经过几个小时的反复试验后,我设法接近了,但这看起来很乏味而且一点都不干。

interface CancellablePromise<T> extends Promise<T> {
cancel: () => void
}
// also need this interface so the variable can be declared
// plus need to redeclare methods to return the new type
interface CancellablePromiseConstructor extends PromiseConstructor {
new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): CancellablePromise<T>;
cancel: () => void
}

type QueryPromise = CancellablePromise<string|boolean> // for parameter types
var QueryPromise: CancellablePromiseConstructor = Promise // for the new operator

// some example code to exercise the promise
function runQuery(text: string): QueryPromise {
return new QueryPromise((resolve,reject) => {nativeQuery(resolve)})
}

我觉得我在错误的道路上走了很长一段路...有谁知道更好的方法吗?

最佳答案

TypeScript 接口(interface)类型 描述契约。你的很好:

interface CancellablePromise<T> extends Promise<T> {
cancel: () => void
}

type QueryPromise = CancellablePromise<string | boolean>

然后您可以根据需要实现契约(Contract)。这是一个例子:

function runQuery(text: string): QueryPromise {
let rejectCb: (err: Error) => void
let p: Partial<QueryPromise> = new Promise<string | boolean>((resolve, reject) => {
rejectCb = reject
/* ... Here the implementation of the query ... */
});
p.cancel = () => {
/* ... Here the implementation of the aborting ... */
rejectCb(new Error("Canceled"))
}
return p as QueryPromise
}

注意事项:

  • 实现cancel应该拒绝 promise ;
  • 我使用 Partial<QueryPromise>为了添加成员cancel之后。

关于typescript - 可以在 Typescript 中向 Promise 添加取消方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46461801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com