HarmonyOS鸿蒙Next中通过Promise.race怎么停掉正在执行的p1异步

HarmonyOS鸿蒙Next中通过Promise.race怎么停掉正在执行的p1异步

@Entry
@Component
struct Index {
  isStop: boolean = false;

  build() {
    Row() {

      Button('执行异步任务')
        .onClick(() => {
          let p1 = new Promise<string>(async (resolve) => {
            let count = 0;
            while(count<100) {
              console.log(`现在循环:${count}`);
              await this.sleep(1000);
              count++;
            }
            resolve('任务完成')
          })
          let p2 = new Promise<string>((resolve) => {
            let id = setInterval(() => {
              if (this.isStop) {
                clearInterval(id);
                this.isStop = false;
                resolve('任务中断');
              }
            }, 50);
          })
          // 按了停止race已经返回p2结果,但是p1还在执行,说好有一个返回就停止执行其他promise的
          Promise.race([p1, p2]).then((value) => {
            console.log(`收到: ${value}`);
          });
        })
      Button('停止运行的异步')
        .onClick(()=>{
          this.isStop = true;
          console.log('按了停止')
        })
    }
  }

    async sleep(value: number){
      await new Promise<void>((resolve) => {
        setTimeout(() => {
          resolve()
        }, value)
      })
    }
}

更多关于HarmonyOS鸿蒙Next中通过Promise.race怎么停掉正在执行的p1异步的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

你理解错了,Promise.race只会返回最先resolve/reject的那个promise结果,不会终止任何其它promise。

更多关于HarmonyOS鸿蒙Next中通过Promise.race怎么停掉正在执行的p1异步的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,Promise.race用于在多个Promise中获取最先完成的结果。要停掉正在执行的p1异步任务,可以通过在p1中抛出一个特定的错误或使用AbortController来中断。AbortController可以生成一个AbortSignal,传递给p1,当需要中断时调用abort()方法。p1内部需要监听AbortSignal并处理中断逻辑。

在HarmonyOS Next中,Promise.race确实会在第一个Promise解决后返回结果,但不会自动取消其他Promise的执行。要停止p1的执行,需要手动实现取消机制。以下是修改建议:

  1. p1中添加取消检查:
let p1 = new Promise<string>(async (resolve, reject) => {
  let count = 0;
  while(count < 100 && !this.isStop) {  // 添加isStop检查
    console.log(`现在循环: ${count}`);
    await this.sleep(1000);
    count++;
  }
  this.isStop ? resolve('任务取消') : resolve('任务完成');
})
  1. 修改p2的停止逻辑:
let p2 = new Promise<string>((resolve) => {
  let id = setInterval(() => {
    if (this.isStop) {
      clearInterval(id);
      resolve('任务中断');
    }
  }, 50);
})

关键点:

  • Promise.race不会自动取消未完成的Promise
  • 需要在异步任务中手动添加取消检查逻辑
  • 使用标志位(isStop)控制任务中断
  • 确保在任务取消后重置状态

这样修改后,当点击停止按钮时,两个Promise都会检测到isStop变化而终止执行。

回到顶部