HarmonyOS鸿蒙Next中ArkTS如何取消Promise

HarmonyOS鸿蒙Next中ArkTS如何取消Promise

在网上搜js,ts发现通过AbortController可以取消Promise,把代码copy过来发现找不到AbortController这个,要怎么import这个AbortController,或者在ArkTs中有什么方法可以取消Promise吗?

cke_775.png


更多关于HarmonyOS鸿蒙Next中ArkTS如何取消Promise的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

可以结合@ohos.events.emitter (Emitter) 自行修改promise状态。

更多关于HarmonyOS鸿蒙Next中ArkTS如何取消Promise的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


承诺收到此发射器取消事件将直接拒绝。

Button(“开始异步任务”) .onClick(async () => { const res = await createPromise(); console.log(res); })

Button(“取消promise”) .onClick(() => { emitter.emit(“eventId”); })

emitter.once(‘eventId’, () => { reject({code: -1, message: “cancel promise”} as BusinessError<string>); });

function createCancellablePromise() { let isCancelled = false; const promise = new Promise((resolve, reject) => { // 模拟一个异步操作(如网络请求) const timeoutId = setTimeout(() => { if (!isCancelled) { resolve(“操作完成”); } else { reject(new Error(“操作已取消”)); } }, 2000); // 返回取消函数 return () => { isCancelled = true; clearTimeout(timeoutId); // 清理资源 }; }); return { promise, cancel: () => isCancelled = true }; }

// 使用示例 const { promise, cancel } = createCancellablePromise();

// 取消操作 cancel();

// 处理结果 promise .then(result => console.log(result)) .catch(err => console.error(err.message));

// 输出:“操作已取消”

在HarmonyOS鸿蒙Next中,ArkTS的Promise没有直接取消的API。可通过封装实现取消功能:

  1. 创建cancel标志位和reject函数引用
let cancel = false;
let rejectFn: (reason?: any) => void;
  1. 在Promise构造函数中保存reject
new Promise((resolve, reject) => {
  rejectFn = reject;
  //...业务逻辑
  if(cancel) reject('cancelled');
});
  1. 需要取消时:
cancel = true;
rejectFn('cancelled');

这种方法通过外部变量控制Promise状态,实际业务中需处理取消后的清理逻辑。

在HarmonyOS Next的ArkTS中,目前没有直接提供AbortController来取消Promise。但可以通过以下两种方式实现类似功能:

  1. 使用标志位控制:
let shouldCancel = false;

async function cancellableTask() {
  if (shouldCancel) throw new Error('Promise cancelled');
  // 你的异步操作
}

// 取消时设置标志位
function cancel() {
  shouldCancel = true;
}
  1. 使用Promise.race实现超时取消:
function cancellablePromise(promise: Promise<any>, timeout: number) {
  const timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => reject(new Error('Timeout')), timeout);
  });
  return Promise.race([promise, timeoutPromise]);
}

这些方法可以模拟Promise取消的效果。ArkTS目前仍在演进中,建议关注后续版本是否会增加原生支持。

回到顶部