宣传儿童过程沟通

时间:2018-01-25 13:25:28

标签: javascript node.js electron es6-promise child-process

是否可以宣传两个流程之间的沟通?

喜欢,发送消息,然后等到收到回复,然后做点什么。

我编写了代码,但我不知道如何解决与已发送消息相关的承诺,因为响应消息是在承诺范围之外的不同函数中接收的:|

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);
});

2 个答案:

答案 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。