---
url: /zh/build/internal-steps/cnb/await-resolve.md
---
`cnb:await` / `cnb:resolve`

\==等待 / 通知机制==，让多个并发 pipeline 相互协作，实现灵活的顺序控制。

* `cnb:await`：等待配对 `key` 对应的 `cnb:resolve` 执行完成后再继续；
* `cnb:resolve`：通知配对 `key` 对应的 `cnb:await` 等待方，并可向它传递数据。

配置步骤时，`type` 请填写 `cnb:await` 或 `cnb:resolve`，
没有 `cnb:await-resolve` 这个 type。

::::tip

`await-resolve` 同 `apply`、`trigger` 的区别：

前者指一个构建中某 pipeline 执行到 await 任务时，
需等待对应 `key` 的其他 pipeline 的 resolve 通知才会继续。

后者指一个 pipeline 触发新的 pipeline，支持异步调用、同步等待和跨仓库触发。
::::

* [使用限制](#cnb-await-resolve-usage-limitations)
* [死锁检测](#cnb-await-resolve-deadlock-detection)
* [适用事件](#cnb-await-resolve-applicable-events)
* [await 参数](#cnb-await-resolve-await-parameters)
* [resolve 参数](#cnb-await-resolve-resolve-parameters)
* [输出结果](#cnb-await-resolve-output)

## 使用限制 {#cnb-await-resolve-usage-limitations}

1. 只能对 `同一个事件` 触发的 pipeline 进行 await 和 resolve 操作
2. 一个 `key` 仅能 resolve 一次，但可以 await 多次
3. 通过 `key` 对 await 和 resolve 进行分组
4. await-resolve 任务只能运行在流水线的 `stages` 中，不能运行在 `endStages` 和 `failStages` 中

## 死锁检测 {#cnb-await-resolve-deadlock-detection}

await 和 resolve 相互配合可以实现灵活的流程控制，但也可能引入更复杂的边界情况，例如：

* 死锁
  * pipeline-1 和 pipeline-2 相互 await
  * 多条 pipeline 间存在 await 环
* 无限等待
  * await 一个不存在的 key，或者 key 没有关联 resolve
  * resolve 所在 pipeline 执行失败
* 重复 resolve
  * 多个 resolve 任务关联同一个 key

`死锁检测` 机制会自动检测以上异常，结束 await 等待状态，并抛出 `dead lock found.` 异常。

await 和 resolve 在配置文件中的声明顺序不影响运行结果，
即排在最后的 await 任务一定会等待对应的 resolve 完成，
这种情况不会被 `死锁检测` 机制终止。

## 适用事件 {#cnb-await-resolve-applicable-events}

[所有事件](../../trigger-rule.md#trigger-event)

## await 参数 {#cnb-await-resolve-await-parameters}

### key {#cnb-await-resolve-await-parameters-key}

* type: String
* required: true

配对 ID

## resolve 参数 {#cnb-await-resolve-resolve-parameters}

### key {#cnb-await-resolve-resolve-parameters-key}

* type: String
* required: true

配对 ID

### data {#cnb-await-resolve-resolve-parameters-data}

* type: object
* required: false

要传递的对象

`key: value` 格式，支持多级。示例：

```yaml{4-8}
- name: resolve a json
  type: cnb:resolve
  options:
    key: demo
    data:
      a: 1
      b:
        c: 2
```

await 任务的结果，是 resolve 声明的 `data` 对象。
可以通过 `exports` 访问这个对象，示例：

```yaml{3-7}
- name: await a json
  type: cnb:await
  options:
    key: demo
  exports:
    a: VAR_A
    b.c: VAR_B
- name: show var
  script:
    - echo ${VAR_A} # 1
    - echo ${VAR_B} # 2
```

当然，也可以不传送任务内容，仅仅表示一个等待动作：

```yaml
- name: ready
  type: cnb:resolve
  options:
    key: i-am-ready
```

```yaml
- name: ready
  type: cnb:await
  options:
    key: i-am-ready
```

## 输出结果 {#cnb-await-resolve-output}

```javascript
{
  // resolve 返回的 data 内容
  data;
}
```
