Skip to content

Promise 实现下发队列

  1. 通过保存 Promise resolve/reject 方式保证执行顺序
  2. 通过 Promise.race([])来实现超时机制

BLE Spec 发送数据模拟

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();
  }
};