Nodejs бегущая функция на фоне - PullRequest
3 голосов
/ 22 апреля 2020

У меня есть программа-ноды, в которой мне нужно запустить две функции в начале программы, а затем получить доступ к результатам функции, в настоящее время с ожиданием каждой функции за раз, это работает, однако, чтобы сэкономить время и не ждать на GetService и GetProcess, так как мне нужны данные позже в проекте. Для получения этих данных требуется около 4 секунд, и я хочу запустить их в фоновом режиме, так как мне не нужны результаты сразу, как я могу это сделать это в node js, если я запускаю promise.all Это будет ждать, пока getService и getProcess, а затем go до завершения программы.

пример

function main() {

//I want to run this both function in background to save time
let service = await GetServices();
this.process = await GetProcess();


…..//Here additional code is running 

//let say that after 30 second this code is called
 Let users = GetUser(service);

 Let users = GetAdress(this.process);
} 

Я действительно работаю в Йоменском генераторе https://yeoman.io/authoring/ https://yeoman.io/authoring/user-interactions.html

export default class myGenerator extends Generator {

//here I want run those function in background to save time as the prompt to the user takes some time (lets say user have many questions...) 
async initializing() {
    let service = await GetServices();
    this.process = await GetProcess();
}

async prompting() {
    const answers = await this.prompt([
      {
        type: "input",
        name: "name",
        message: "Your project name",
        default: this.appname // Default to current folder name
      },
      {
        type: "confirm",
        name: "list",
        choises: this.process //here I need to data from the function running in background
      }
    ]);

}

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

Чтобы делать то, что вам нужно, вы должны понимать событие l oop.

Nodejs предназначено для работы в одном потоке в отличие от языков, таких как go однако nodejs обрабатывает процесс в разных потоках. так что вы можете использовать nextTick (), чтобы добавить новое событие в основной поток, и оно будет выполнено в конце всего блока.

    function main() {

    //I want to run this both function in background to save time
    let service = await GetServices();
    this.process = await GetProcess();


    …..//Here additional code is running 

    //Let say that after 30 second this code is called
     Let users = GetUser(service);

     Let users = GetAdr(this.process);
    } 


 function someFunction(){
 // do something...
  }
 main();
 process.nextTick(someFunction());// happens after all main () processes are terminated...
1 голос
/ 23 апреля 2020

Предположим, что getServices() может занять 3 секунды, а getProcess() может занять 4 секунды, поэтому, если вы запустите обе эти функции одновременно, вы получите всего 4 секунды с возвращаемыми значениями из обоих обещаний.

Вы можете выполнить код, пока этот процесс выполняется в фоновом режиме, после выполнения обещаний будет выполнен обратный вызов, на этом этапе будут вызваны ваши поздние функции.

Проверьте приведенный ниже простой пример ;

let service;
let process;

function main() {

    // Both functions will execute in background
    Promise.all([getServices(), getProcess()]).then((val) => {

        service = val[0];
        process = val[1];

        console.log(service, process);

        // Aafter completed this code will be called
        // let users = GetUser(service);
        // let users = GetAdress(process);
        console.log('I am called after all promises completed.')
    });

    // Current example.
    // let service = await GetServices();
    // this.process = await GetProcess();

    /* Code blocks.. */
    console.log('Code will execute without delay...')
}

function getServices() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("service is returned")
        }, 3000);
    });
}

function getProcess() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("process is returned")
        }, 4000);
    });
}

main();
1 голос
/ 22 апреля 2020

Вы можете запустить асинхронную операцию, но еще не ждать ее:

function suppressUnhandledRejections(p) {
  p.catch(() => {});
  return p;
}

async function main() {
  // We have to suppress unhandled rejections on these promises. If they become
  // rejected before we await them later, we'd get a warning otherwise.
  const servicePromise = suppressUnhandledRejections(GetServices());
  this.processPromise = suppressUnhandledRejections(GetProcess());

  // Do other stuff
  const service = await servicePromise;
  const process = await this.processPromise;
}

Также рассмотрите возможность использования Promise.all(), которая возвращает обещание для завершения всех обещаний, переданных ему.

async function main() {
  const [ services, process, somethingElse ] = await Promise.all([
    GetServices(),
    GetProcess(),
    SomeOtherAsyncOperation(),
  ]);

  // Use the results.
}
...