Skip to content

资源:把能力表达为操作 ​

资源回答“这段工作可以对外部对象做什么”。作者定义操作契约,宿主把契约接到具体对象,节点只申请自己需要的操作。这样,便签保存规则由 Notes 负责,节点通过读取或追加方法完成工作,不需要拿到整个便签集合。

从操作开始 ​

便签助手定义两个 ResourceOffer。读取契约只公开 read,写入契约只公开 append;它们可以连接同一个 Notes 对象,却表达不同的使用资格。

js
const reading = new ResourceOffer({
  methods: {
    read(notes, id) {
      const note = notes.read(id);
      onRead(note); // 仅在真实读取成功后输出宿主日志。
      return note;
    },
  },
});
const writing = new ResourceOffer({
  methods: {
    append(notes, value) {
      const note = notes.append(value);
      onWrite(note);
      return note;
    },
  },
});

Offer 是可复用的操作声明,request() 生成供结构填写 deps 的申请。宿主通过 Resources.register 将 Resource 包裹的对象与 Offer 配对。Offer 的准确身份参与匹配,方法同名不能替代登记关系。

Node 在本次 Work 中通过 work.resources 取得端点。这里的端点执行窗口检查,再委托资源方法。实体原对象只交给适配方法,业务节点使用的是明确开放的能力。适配器适合连接业务实体、文件访问或其他服务;对象的内容格式和更新规则仍由对象自身定义。

接线固定,访问按次打开 ​

build 检查申请和供给,固定接线;真正运行时才取得本次材料并打开访问窗口。窗口关闭后,保存下来的端点也不能继续使用。实体可以继续存在,宿主可以让下一次调用通过新的窗口访问它。

本层 deps 和子树 supply 有不同用途:前者决定当前工作能调用什么,后者让子工作取得它申请的材料。父结构负责供给一个写入能力,并不因此获得在自身 Work 中写入的权限。按输入收窄资源时,也只能缩小已有范围。

这使资源控制可以跟随真实调用和阶段,而无需业务保存“当前调用”这样的全局状态。异步资源方法仍须被正确等待;关闭访问窗口不会撤销已经发生的写入,也不能把尚未结束的异步工作算作完成。

操作结果如何交给业务 ​

普通资源操作与子调用都支持 delta/result 接收。delta 用于过程预览,result 的成功或失败回调参与业务处理。方法已经返回、回调已经接纳、实体已经落实写入,是需要分别判断的事实。普通资源返回不会自动固定为正式调用交付;本例便签材料由 Notes 主动固定,Node 返回时再进入调用的正式交付边界。回调失败不会再进入同一操作的失败回调;取消和必要保存等机制故障也不能被普通兜底结果遮住。

回到助手,readNote 只申请 reading,writeNote 只申请 writing;模型可以提出工具选择,却不能跳过这些登记和访问边界。继续看资源教程中的完整接线,或阅读资源参考了解捕获、收窄、窗口关闭与适配端口。