OpenHarmony开发者论坛
标题:
[OpenHarmony学习计划] Promise 相关高级用法
[打印本页]
作者:
lishengzxc
时间:
2024-6-21 08:27
标题:
[OpenHarmony学习计划] Promise 相关高级用法
[md]## 0. 前端视角 ArkTS 使用 Promise 的不同点
![cke_2768.png](
https://alliance-communityfile-d ... E8EE501362315CA.png
)
```javascript
Type inference in case of generic function calls is limited (arkts-no-inferred-generic-params) <ArkTSCheck>复制
```
如何解决:[
https://gitee.com/openharmony/do ... -migration-guide.md
](
https://gitee.com/openharmony/do ... -migration-guide.md
)
![cke_6278.png](
https://alliance-communityfile-d ... 00000:2800
)
# 基础用法
[
https://javascript.ruanyifeng.com/advanced/promise.html
](
https://javascript.ruanyifeng.com/advanced/promise.html
)
# 高级用法
## 1. 高级并发控制
使用 Promise.all 可以并行执行多个Promise,但当需要控制并发的请求数量时,可以通过实现一个并发控制函数来控制同时执行的Promise数量。
```javascript
const concurrentPromises = (promises, limit) => {
return new Promise((resolve, reject) => {
let i = 0;
let result = [];
const executor = () => {
if (i >= promises.length) {
return resolve(result);
}
const promise = promises[i++];
Promise.resolve(promise)
.then(value => {
result.push(value);
if (i < promises.length) {
executor();
} else {
resolve(result);
}
})
.catch(reject);
};
for (let j = 0; j < limit && j < promises.length; j++) {
executor();
}
});
};
```
## 2. Promise 的取消
原生的Promise是无法取消的,但我们可以通过引入一个可控的中断逻辑来模拟取消Promise,参考:[
https://github.com/wuyunqiang/dy ... /task-cancelable.ts
](
https://github.com/wuyunqiang/dy ... /task-cancelable.ts
)
```javascript
/**
* 将一个promise转换为一个可取消的promise
* @param {Promise} task 希望被转换的promise实例
* @returns {Promise} 返回具有cancel()&isCancel()的promise对象
*/
export const TaskCancelable = (task: Promise<any>) => {
let _reject: Resolve;
let isCancel = false;
const _status = Symbol("cancel");
const cancelP = new Promise((resolve, reject) => {
_reject = reject;
});
const p = Promise.race([task, cancelP]) as PromiseCancel;
/***
* 调用cancel时可能promise状态已经变为成功,
* 所以不能在cancel里面改变isCancel
* 只有catch的原因是cancel才代表被取消成功了
*/
p.catch((reason) => {
// 注意这里的比较 只有报错的原因是我们的symbol 才是用户手动取消的
if (reason === _status) {
isCancel = true;
}
});
p.cancel = () => {
_reject(_status);
return p;
};
p.isCancel = () => {
return isCancel;
};
return p;
};
```
## 3. 顺序执行 Promise 数组
有时候我们需要按顺序执行一组Promise,以确保前一个异步操作完成后再开始下一个。
```javascript
const sequencePromises = promises =>
promises.reduce(
(prev, next) => prev.then(() => next()),
Promise.resolve()
);
```
## 4. Promise 如何重试
当Promise因为某些暂时性的错误被拒绝时,可能希望能够重试执行。
```javascript
const retryPromise = (promiseFn, maxAttempts, interval) => {
return new Promise((resolve, reject) => {
const attempt = attemptNumber => {
if (attemptNumber === maxAttempts) {
reject(new Error('Max attempts reached'));
return;
}
promiseFn().then(resolve).catch(() => {
setTimeout(() => {
attempt(attemptNumber + 1);
}, interval);
});
};
attempt(0);
});
};
```
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5