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
的执行,需要手动实现取消机制。以下是修改建议:
- 在
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('任务完成');
})
- 修改
p2
的停止逻辑:
let p2 = new Promise<string>((resolve) => {
let id = setInterval(() => {
if (this.isStop) {
clearInterval(id);
resolve('任务中断');
}
}, 50);
})
关键点:
Promise.race
不会自动取消未完成的Promise- 需要在异步任务中手动添加取消检查逻辑
- 使用标志位(
isStop
)控制任务中断 - 确保在任务取消后重置状态
这样修改后,当点击停止按钮时,两个Promise都会检测到isStop
变化而终止执行。