Promise 实现下发队列
- 通过保存 Promise resolve/reject 方式保证执行顺序
- 通过 Promise.race([])来实现超时机制
js
import ble from "./utils/ble_spec";
const queue = [];
let isRun = false;
/**
* 通过 BLE Spec 设置属性值数据。
* 请修改此函数以实现功能。
* @param {string} data
* @param {import("./utils/ble_spec").Options} [options]
* @returns {Promise<string>}
*/
export const setPropertiesValue = async (data, options) => {
return new Promise((resolve, reject) => {
const item = {
resolve: resolve,
reject: reject,
promise: () => ble.setPropertiesValue(data, options)
};
queue.push(item);
if (!isRun) loop();
});
};
// 创建一个 Promise,在 500ms 后 reject
const timeoutPromise = () => {
return new Promise((_, reject) => setTimeout(() => reject(), 3000));
};
const loop = async () => {
if (queue.length == 0) return;
isRun = true;
const { resolve, reject, promise } = queue[0];
try {
// 哪个先执行完成
await Promise.race([promise(), timeoutPromise()]);
resolve();
isRun = false;
queue.shift();
loop();
} catch (err) {
reject();
isRun = false;
queue.shift();
loop();
}
};import ble from "./utils/ble_spec";
const queue = [];
let isRun = false;
/**
* 通过 BLE Spec 设置属性值数据。
* 请修改此函数以实现功能。
* @param {string} data
* @param {import("./utils/ble_spec").Options} [options]
* @returns {Promise<string>}
*/
export const setPropertiesValue = async (data, options) => {
return new Promise((resolve, reject) => {
const item = {
resolve: resolve,
reject: reject,
promise: () => ble.setPropertiesValue(data, options)
};
queue.push(item);
if (!isRun) loop();
});
};
// 创建一个 Promise,在 500ms 后 reject
const timeoutPromise = () => {
return new Promise((_, reject) => setTimeout(() => reject(), 3000));
};
const loop = async () => {
if (queue.length == 0) return;
isRun = true;
const { resolve, reject, promise } = queue[0];
try {
// 哪个先执行完成
await Promise.race([promise(), timeoutPromise()]);
resolve();
isRun = false;
queue.shift();
loop();
} catch (err) {
reject();
isRun = false;
queue.shift();
loop();
}
};
LinQiang·Shen