同类多实例场景下如何等待某实例的输出并将结果传递给其他实例
问题根因
- 你当前的
output方法逻辑完全和需求相反:你现在设计的是调用方传入参数赋值后返回,而你需要的是调用方什么都不传,从计算机实例里拿到已经生成的输出值。 - 你用了
await关键字说明期望方法返回Promise,但当前方法是同步执行的,不会触发等待逻辑,调用时没传参就会直接拿到undefined。
改造方案
你需要给计算机类增加输出队列和等待回调的支持,实现异步等待输出的能力:
1. 给类增加初始化属性
在你的计算机类构造函数里新增两个字段:
class Computer { constructor() { // 原有初始化逻辑保留 this.outputQueue = []; // 存储已经生成、还未被读取的输出值 this.pendingOutputResolve = null; // 存储还没等到输出的调用方的回调 } }
2. 新增输出推送方法
当计算机执行到输出指令、生成了需要传给下一级的数值时,调用这个方法:
// 传入生成的输出值即可 pushOutput(value) { // 如果已经有调用方在等输出,直接把值传给回调完成等待 if (this.pendingOutputResolve) { this.pendingOutputResolve(value); this.pendingOutputResolve = null; return; } // 没有调用方等待的话,先把值存到队列里 this.outputQueue.push(value); }
3. 改造output方法
把原来的output方法替换成下面的实现,不需要任何入参:
async output() { // 队列里有现成的输出,直接返回最早生成的那个 if (this.outputQueue.length > 0) { return this.outputQueue.shift(); } // 没有现成输出,返回Promise等待后续生成的输出 return new Promise(resolve => { this.pendingOutputResolve = resolve; }); }
效果
你原来的调用代码不需要做任何修改,this.code[this.code[i + 1]] = await ampA.output()就会自动等待ampA生成下一个输出,再把值赋值给目标变量,完全适配5个实例循环传值的并发场景。
新手补充说明
await只能作用在Promise对象上,普通同步方法用await不会有等待效果,会直接同步执行完成- 如果你还没改造输入读取的逻辑,记得用同样的思路把输入读取也改成异步等待的模式,不然整个执行流程会卡住
内容的提问来源于stack exchange,提问作者Adam Z
相关产品推荐
相关产品推荐

