是否可以宣传两个流程之间的沟通?
喜欢,发送消息,然后等到收到回复,然后做点什么。
我编写了代码,但我不知道如何解决与已发送消息相关的承诺,因为响应消息是在承诺范围之外的不同函数中接收的:|
var worker, job_id, promises = [];
worker = child_process.fork(__dirname + '/w.js');
worker.on('message', (message) => {
let job_id = message.job_id;
// how to resolve promises[job_id] ??
});
function send(data){
job_id++;
data.job_id = job_id;
worker.send(data);
var promise = new Promise((resolve, reject) => {
// how to resolve this in the message handler?
});
promises[job_id] = promise;
}
此功能应该像
一样使用send(data).then((response_message) => {
console.log(response_message);
});
答案 0 :(得分:1)
不要存储承诺,存储resolve
函数:
const worker = child_process.fork(__dirname + '/w.js');
const jobs = new Map();
let job_id;
worker.on('message', message => {
const job_id = message.job_id;
const resolve = jobs.get(job_id);
jobs.delete(job_id);
resolve(message);
});
function send(data){
data.job_id = job_id++;
worker.send(data);
return new Promise(resolve => {
jobs.set(job_id, resolve);
});
}
答案 1 :(得分:1)
使用与工人的承诺是一个非常好的主意,但我很难理解你的需求。您有一个巨大的优势,即能够将每个作业的消息对象的属性作为消息对象的属性发送/接收job_id
。这大大简化了任务。只需提前将job_id
附加到data
对象,然后按照以下步骤操作;
function send(worker, data){ // data already has a job_id property
worker.send(data);
return new Promise((v,x) => worker.onmessage(v), worker.onmessageerror(x));
}
var data = {data: "someData", job_id: 1};
send(myWorker, data)
.then(m => doSomethingWith(m.job_id, m.data))
即使您没有机会向工作人员发送和接收job_id
,也可以通过将他们放入数组并通过Promise.all()
解雇来跟踪承诺。 。这对分散在几个工人身上的分割工作非常有益。
function send(worker, data){ // data has no job_id property
worker.send(data);
return new Promise((v,x) => worker.onmessage(v), worker.onmessageerror(x));
}
var segmentedJobs = [job0, job1, job2],
jobPromises = segmentedJobs.map((j,i) => Promise.all([send(j),i]));
Promise.all(jobPromises)
.then(rs => rs.map(([data,id]) => doSomethingWith(data,id)));
然而,大多数情况下,分段作业会导致相互关联的数据被处理。在这种情况下,你可以减少或扫描promises数组,甚至不用担心任何工作ID。