4.4.1.2 将操作排入队列

RTCPeerConnection对象有一个操作队列[[Operations]],它确保队列中只有一个异步操作同时执行。如果下一个 promise 请求被调用时之前的 promise 还没返回,则将它们添加到队列中并等到队列前面所有的 promise 执行完毕并返回后再执行。

要将操作加入 RTCPeerConnection 对象的操作队列,请运行以下步骤:

  1. 让连接成为 RTCPeerConnection 对象。

  2. 如果 connection 的[[IsClosed]] 值为true,用 promise 包装一个新创建的 InvalidStateError 并以reject返回。

  3. 让操作成为即将入队的那一项。

  4. 创建新 promise ,名为 p

  5. 将操作附加到[[操作]]列表中。

  6. 如果[[操作]]的长度恰好为1,则执行操作。

  7. promise返回后,如果状态是 fulfillment 或 rejection,请执行以下步骤:

    1. 如果connection的[[IsClosed]]值为true,则中止这些步骤。

    2. 如果操作返回的 promise 已完成并有值,则将 p 以 fulfill 的状态返回该值。

    3. 如果操作返回的 promise 被拒绝并有值,则将 p 以 rejected 的状态返回该值。

    4. 完成或拒绝p后,执行以下步骤:

      1. 如果connection的[[IsClosed]]值为true,则中止这些步骤。

      2. 删除[[操作]]的第一个元素。

      3. 如果[[操作]]非空,则执行[[操作]]队列中的第一个操作。

  1. 返回 p。