Как обрабатывать файлы .JS по отдельности синхронно один за другим в узле js после того, как каждый из них завершил выполнение своих задач? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть набор файлов .js, которые выполняют определенные задачи. Я хотел бы обрабатывать эти файлы по отдельности синхронно после того, как каждый из них завершил выполнение своих задач.

Прямо сейчас, когда я запускаю свой код, все функции работают отлично, но асинхронно. Боюсь, что я также пытался с обещаниями (взгляните на // FILE parent v2 в коде), но все же кажется, что задача выполняется в порядке, но не ожидает обработки один за другим.

Я почти уверен, что должно быть базовое решение этой проблемы. все же мои навыки программирования скудны.

спасибо за понимание.

сейчас мой код выглядит так:

//FILE parent.js
const cp = require('child_process');
const path = require('path');

//PROCESS1
var child_call = cp.fork("process1.js")

child_call.on("exit", () => {
  console.log("1st funtion finished");
})

//PROCESS2
var child_capture = cp.fork("process2.js")

child_capture.on("exit", () => {
  console.log("2nd funtion finished");
})
//PROCESS3
var child_render = cp.fork("process3.js")

child_render.on("exit", () => {
  console.log("3rd funtion finished");
})


//FILE v2 Promisess parent.js


const async = require('async');
const cp = require('child_process');
const path = require('path');


function addPromise() {
  return new Promise(resolve => {
    var child_call = cp.fork("process1.js")

    child_call.on("exit", () => {
      console.log("1st funtion finished");
    })
    resolve()
  });
}

function addCapture() {
  return new Promise(resolve => {
    var child_capture = cp.fork("process2.js")

    child_capture.on("exit", () => {
      console.log("2nd funtion finished");
    })
    resolve()
  });
}

function addRender() {
  return new Promise(resolve => {
    var child_render = cp.fork("process3.js")

    child_render.on("exit", () => {
      console.log("3rd funtion finished");
    })
    resolve()
  });
}

async function addAsync() {
  const a = await addPromise();
  const b = await addCapture();
  const c = await addRender();
  return a + b + c;
}


addAsync().then((sum) => {
  console.log(sum);
});

1 Ответ

0 голосов
/ 20 марта 2019

require и module.exports

Одним из решений, которое сразу же выпрыгивает, является использование require вместо child_process.fork. Таким образом, импортированный код будет работать синхронно, и вы получите прямой вывод.

Пример:

function add() {
  const a = require('a.js');
  const b = require('b.js');
  const c = require('c.js');
  return a + b + c;
}

// or you can make it more usable
function addModules(...fileNames) {
  return fileNames
    .map(fileName => require(fileName))
    .reduce((total, x) => total + x, 0);
}

Обратите внимание, что вам нужно будет , чтобы экспортировать результаты из этих файлов , если вы хотите их использовать.

// Do your stuff here:
const x = 42;

// Export it
module.exports = x;

Или вы можете использовать deasync

Deasync позволяет вам выполнять обещание синхронно, передавая ему эту функцию.

Пример:

const cp = require('child_process');
const deasync = require('deasync');

const fork = deasync(cp.fork);

function addPromise() {
  const child_call = fork('process1.js');
  // now synchronous
};
// repeat as needed

function add() {
  const a = addPromise();
  // ...
  return a + b + c;
}

Примечание: deasync раскрывает подробности реализации Node.js на уровне языка и поэтому не должен использоваться, если другие более безопасные решения не работают для вас.

...